在一列中创建没有重复的数据框,但在其他列中可能有重复项

时间:2013-08-06 15:04:12

标签: r

当我的数据框在两列上都包含重复项时,我在创建矩阵时遇到问题 实施例

n = c('A', 'B', 'C', 'A', 'B', 'B')
s = c("aa", "bb", "cc","dd","aa","cc")
df = data.frame(n, s)

但是使用df我需要创建这样的东西: 新数据框(NDF)

A  "aa" "dd"
B  "bb" "aa" "cc"
C  "cc"  

正如您所看到的,我在数据框df中仅使用了列n中的唯一值,并且行使用df $ s中的值填充,此示例中的最新值可能为零或na(现在为空)

F<-matrix(nrow=length(unique(df$n)),ncol=length(unique(df$s)))

但是当我试图在这里做一个循环时(For(i)... For。(j)...)我无法弄明白该怎么做./ 任何帮助都非常受欢迎 提前致谢

2 个答案:

答案 0 :(得分:0)

不清楚你想要什么,因为data.frame必须是矩形的。

也许你想要这个:

tapply(s, n, list)
#$A
#[1] "aa" "dd"
#
#$B
#[1] "bb" "aa" "cc"
#
#$C
#[1] "cc"

答案 1 :(得分:0)

您可以使用dcast包中的plyr函数获取以下data.frame:

dcast(data=df, n ~ s)
  n   aa   bb   cc   dd
1 A   aa <NA> <NA>   dd
2 B   aa   bb   cc <NA>
3 C <NA> <NA>   cc <NA>

如果您希望“在前面”拥有所有非NA值,则需要执行更多操作。我已经找到了以下解决方案,这个解决方案根本没有用,但是很有效。

x <- dcast(data=df, n ~ s)
t(apply(x ,1 ,function(x){
                          tmp <- sum(is.na(x))
                          c(x[complete.cases(x)], rep(NA,tmp))
                          }))
     [,1] [,2] [,3] [,4] [,5]
[1,] "A"  "aa" "dd" NA   NA  
[2,] "B"  "aa" "bb" "cc" NA  
[3,] "C"  "cc" NA   NA   NA