[问题] 依序比对变量产生新资料

楼主: sinclairJ (KEEP MOVING FORWARD)   2015-08-02 23:03:29
问题一
[问题类型]:
程式咨询(我想用R 做某件事情,但是我不知道要怎么用R 写出来)
[软件熟悉度]:
新手(没写过程式,R 是我的第一次)
目前较懂得用packages做分析 但对于资料预处理还是不太熟悉
[问题叙述]:
我要怎么找出该栏的最小三个值所对应之"列样本"
[程式范例]:
#资料产生
sample1=sample(1:3,100,replace=T)
sample2=sample(1:3,100,replace=T)
sample3=sample(1:3,100,replace=T)
sample4=sample(1:3,100,replace=T)
sample5=sample(1:3,100,replace=T)
data=as.data.frame(rbind(sample1,sample2,sample3,sample4,sample5))
#转成类别型资料
for(i in 1:ncol(data)) data[,i]=as.factor(data[,i])
#计算样本与样本间相似程度,m表示距离矩阵,数值越小表示越相似
n=nrow(data)
m=matrix(nrow=n,ncol=n)
for(i in seq_len(n - 1))
for(j in seq(i, n))
m[j, i]=m[i, j]=sum(data[i,] != data[j,])
#m的输出会长这样,其中col1代表sample1,以此类推
col1 col2 col3 col4 col5
1 0 25 65 56 24
2 58 0 45 23 84
3 65 73 0 77 36
4 21 53 43 0 71
5 25 36 68 74 NA
问题:我要找col1中最小的两个值之样本,也就是4和5,有什么语法可供参考吗?
因为如果用which.min(data[,1])的话,只会得到4
问题二
[问题类型]:
*[1;30;40m
程式咨询(我想用R 做某件事情,但是我不知道要怎么用R 写出来)
*[m
[软件熟悉度]:
*[1;30;40m请把以下不需要的部份删除
新手(没写过程式,R 是我的第一次)*[m
[问题叙述]:
*[1;30;40m请简略描述你所要做的事情,或是这个程式的目的*[m
现有三个样本,每个样本有100个变量,所以维度是3*100
我想依序比对这三个样本之变量来产生第四个样本(图示a)
在产生的过程中 该变量以多数决的方式产生第四个样本之变量(图示b)
若遇到无法以多数决的方式产生之情况(图示c)
就截至比对目前结果为止,找出三个样本哪个与第四个样本最接近
并根据此样本的值去产生该变量(说明d)
a.
V1 V2 V3 V4 V5 V6 V7 ... ... V100
sample1 1 3 2 3 1 3 2 ... ... 1
sample2 3 2 1 3 2 1 3 ... ... 1
sample3 1 3 2 3 1 3 1 ... ... 2
sample4 1 3 2 3 1 3 2 ... ... 1
b.(以V1为例)
V1 V2 V3 V4 V5 V6 V7 ... ... V100
sample1 "1" 3 2 3 1 3 2 ... ... 1
sample2 3 2 1 3 2 1 3 ... ... 1
sample3 "1" 3 2 3 1 3 1 ... ... 2
sample4 1 3 2 3 1 3 2 ... ... 1
c.(以V7为例)
V1 V2 V3 V4 V5 V6 V7 ... ... V100
sample1 1 3 2 3 1 3 "2" ... ... 1
sample2 3 2 1 3 2 1 "3" ... ... 1
sample3 1 3 2 3 1 3 "1" ... ... 2
sample4 1 3 2 3 1 3 2 ... ... 1
d.
因为到V7卡住,所以先对Sample1到Sample4(V1~V6)算一次相似程度
计算的方式与问题一相同,所以比对程序截至到V6,此时的距离矩阵为
col1 col2 col3 col4
1 0 5 0 0
2 5 0 5 5
3 0 5 0 0
4 0 5 0 NA
(情况1)从结果可知 第四个样本(col4)与第一与第三个样本较相似
此时可根据第一与第三个样本的V7,第四个样本的V7可任意填入2或1
(情况2)
col1 col2 col3 col4
1 0 5 0 0
2 5 0 5 5
3 0 5 0 "1"
4 0 5 0 NA
如果今天算出来的距离矩阵是这样 就可以很确定第四个样本的V7要填入2
[程式范例]:
sample1=sample(1:3,100,replace=T)
sample2=sample(1:3,100,replace=T)
sample3=sample(1:3,100,replace=T)
data=as.data.frame(rbind(sample1,sample2,sample3))
接下来就请各位前辈多多提点一下了~感谢帮忙
作者: andrew43 (讨厌有好心推文后删文者)   2015-08-02 23:23:00
1. order(m$col1)2. 有点复杂。没有例外大概从众数下手。因为众数不一定唯一或存在,所以看你众数的例外处理如何才能再继续写下去。可以从table(foo)来检查foo的频率,这大概是第一步。
楼主: sinclairJ (KEEP MOVING FORWARD)   2015-08-02 23:30:00
因为只会用三个样本去生成一个样本 所以我目前想到的处理方式就是情况1与情况2 呜呜
作者: andrew43 (讨厌有好心推文后删文者)   2015-08-02 23:31:00
另外我觉得先不要看多个变量。一次解一个变量,再套用。
楼主: sinclairJ (KEEP MOVING FORWARD)   2015-08-02 23:36:00
哦~从变量的角度下去看就是了 谢谢a大建议 我在想想~
作者: celestialgod (天)   2015-08-02 23:41:00
1. 建议你的m 对角线都变更成NA不然你的order取下去可能有问题
楼主: sinclairJ (KEEP MOVING FORWARD)   2015-08-02 23:53:00
目前想到用recode 但会把将非对角线的0也取代
作者: celestialgod (天)   2015-08-02 23:53:00
http://pastebin.com/qYYgXYAflibrary(Matrix)没用到
楼主: sinclairJ (KEEP MOVING FORWARD)   2015-08-02 23:54:00
library(car);recode(m,"0=NA")
作者: celestialgod (天)   2015-08-02 23:55:00
你如果遇到有0个相等怎么办?
楼主: sinclairJ (KEEP MOVING FORWARD)   2015-08-02 23:59:00
没有一定要找一模一样的 就找距离最小的 所以如果第四个样本所对应第一,二及三的距离为 11,20,5(举例)那就以第三个样本为基准去填补第四个样本之该变量
作者: celestialgod (天)   2015-08-03 00:06:00
我的意思是你用recode会有问题如果你要用那个距离矩阵算order的话第二个问题只要算一行的相似矩阵,不建议算整个矩阵
楼主: sinclairJ (KEEP MOVING FORWARD)   2015-08-03 00:15:00
哦 了解了 谢C大提醒
作者: celestialgod (天)   2015-08-03 00:19:00
还有一件事,你生成的资料,每一行的levels是不同,计算相等会有问题...
楼主: sinclairJ (KEEP MOVING FORWARD)   2015-08-03 00:20:00
如果转成as.character会能解决吗?
作者: celestialgod (天)   2015-08-03 00:20:00
当然我连结的生成方式也是有问题可以解决建议不要factor了,直接用character或是int做
楼主: sinclairJ (KEEP MOVING FORWARD)   2015-08-03 00:23:00
OK~谢C大提醒
作者: celestialgod (天)   2015-08-03 21:20:00
直接在>1那里改就好建议这样做 http://pastebin.com/fLwhB3Ca我不知道你距离相等怎么做,我直接帮你设定随机抽最后再去改算不出mode的部分,会比较有效率why colwise 请看#1LeXNCKV (R_Language)
楼主: sinclairJ (KEEP MOVING FORWARD)   2015-08-04 01:32:00
有try了一下 目前尚未遇到问题 谢谢C大帮忙会问题在推文询问你了~感谢!

Links booklink

Contact Us: admin [ a t ] ucptt.com