作者sinclairJ (SunnyGymBoy)
看板R_Language
标题[问题] 依序比对变数产生新资料
时间Sun Aug 2 23:03:29 2015
问题一
[问题类型]:
程式谘询(我想用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))
接下来就请各位前辈多多提点一下了~感谢帮忙
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 111.184.161.128
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/R_Language/M.1438527811.A.57F.html
※ 编辑: sinclairJ (111.184.161.128), 08/02/2015 23:06:27
1F:→ andrew43: 1. order(m$col1) 08/02 23:23
2F:→ andrew43: 2. 有点复杂。没有例外大概从众数下手。 08/02 23:25
3F:→ andrew43: 因为众数不一定唯一或存在,所以看你众数的例外处理如何 08/02 23:26
4F:→ andrew43: 才能再继续写下去。 08/02 23:27
5F:→ andrew43: 可以从table(foo)来检查foo的频率,这大概是第一步。 08/02 23:28
6F:→ sinclairJ: 因为只会用三个样本去生成一个样本 所以我目前想到的 08/02 23:30
7F:→ sinclairJ: 处理方式就是情况1与情况2 呜呜 08/02 23:30
8F:→ andrew43: 另外我觉得先不要看多个变数。一次解一个变数,再套用。 08/02 23:31
9F:→ sinclairJ: 哦~从变数的角度下去看就是了 谢谢a大建议 我在想想~ 08/02 23:36
10F:→ celestialgod: 1. 建议你的m 对角线都变更成NA 08/02 23:41
11F:→ celestialgod: 不然你的order取下去可能有问题 08/02 23:42
12F:→ sinclairJ: 目前想到用recode 但会把将非对角线的0也取代 08/02 23:53
14F:→ celestialgod: library(Matrix)没用到 08/02 23:54
15F:→ sinclairJ: library(car);recode(m,"0=NA") 08/02 23:54
16F:→ celestialgod: 你如果遇到有0个相等怎麽办? 08/02 23:55
17F:→ sinclairJ: 没有一定要找一模一样的 就找距离最小的 所以如果 08/02 23:59
18F:→ sinclairJ: 第四个样本所对应第一,二及三的距离为 11,20,5(举例) 08/03 00:00
19F:→ sinclairJ: 那就以第三个样本为基准去填补第四个样本之该变数 08/03 00:00
20F:→ celestialgod: 我的意思是你用recode会有问题 08/03 00:06
21F:→ celestialgod: 如果你要用那个距离矩阵算order的话 08/03 00:07
22F:→ celestialgod: 第二个问题只要算一行的相似矩阵,不建议算整个矩阵 08/03 00:08
23F:→ sinclairJ: 哦 了解了 谢C大提醒 08/03 00:15
24F:→ celestialgod: 还有一件事,你生成的资料,每一行的levels是不同, 08/03 00:19
25F:→ celestialgod: 计算相等会有问题... 08/03 00:19
26F:→ sinclairJ: 如果转成as.character会能解决吗? 08/03 00:20
27F:→ celestialgod: 当然我连结的生成方式也是有问题 08/03 00:20
28F:→ celestialgod: 可以解决 08/03 00:20
29F:→ celestialgod: 建议不要factor了,直接用character或是int做 08/03 00:21
30F:→ sinclairJ: OK~谢C大提醒 08/03 00:23
32F:→ sinclairJ: 有参考网路上这个写法,能取出每个column的众数,不过 08/03 20:58
33F:→ sinclairJ: 遇到该col是0,1,2的时候就会挂掉,请问该怎麽在functio 08/03 20:59
34F:→ sinclairJ: n里加入条件式比较好? 08/03 20:59
35F:→ celestialgod: 直接在>1那里改就好 08/03 21:20
37F:→ celestialgod: 我不知道你距离相等怎麽做,我直接帮你设定随机抽 08/03 21:42
38F:→ celestialgod: 最後再去改算不出mode的部分,会比较有效率 08/03 21:45
40F:→ sinclairJ: 有try了一下 目前尚未遇到问题 谢谢C大帮忙 08/04 01:32
41F:→ sinclairJ: 会问题在推文询问你了~感谢! 08/04 01:32