输入
row.no column2 column3 column4
1 bb ee up
2 bb ee down
3 bb ee up
4 bb yy down
5 bb zz up
Run Code Online (Sandbox Code Playgroud)
我有一个规则删除第1行和第2行和第3行,因为第1,2和3行的第2列和第3列是相同的,第4列中找到了矛盾的数据(up
和 down
).
如何让R在column2和column3中删除具有相同名称的行,但是收缩第3列以生成矩阵,如下所示:
row.no column2 column3 column4
4 bb yy down
5 bb zz up
Run Code Online (Sandbox Code Playgroud)
包中的功能plyr
确实在这类问题上大放异彩.这是一个使用两行代码的解决方案.
设置数据(由@GavinSimpson友情提供)
dat <- structure(list(row.no = 1:5, column2 = structure(c(1L, 1L, 1L,
1L, 1L), .Label = "bb", class = "factor"), column3 = structure(c(1L,
1L, 1L, 2L, 3L), .Label = c("ee", "yy", "zz"), class = "factor"),
column4 = structure(c(2L, 1L, 2L, 1L, 2L), .Label = c("down",
"up"), class = "factor")), .Names = c("row.no", "column2",
"column3", "column4"), class = "data.frame", row.names = c(NA,
-5L))
Run Code Online (Sandbox Code Playgroud)
加载plyr
包
library(plyr)
Run Code Online (Sandbox Code Playgroud)
使用ddply
分割,分析,并结合DAT.以下代码行分析将dat分别拆分为(column2和column3)的唯一组合.然后我添加一个名为unique的列,它计算每个set4的column4唯一值的数量.最后,使用简单的子集来仅返回unique == 1的行,并删除第5列.
df <- ddply(dat, .(column2, column3), transform,
row.no=row.no, unique=length(unique(column4)))
df[df$unique==1, -5]
Run Code Online (Sandbox Code Playgroud)
结果如下:
row.no column2 column3 column4
4 4 bb yy down
5 5 bb zz up
Run Code Online (Sandbox Code Playgroud)