R:根据两列的相似性检查删除列

Cat*_*ine 5 r rows plyr

输入

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)

And*_*rie 6

包中的功能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)