删除数据框

时间:2015-08-17 16:10:49

标签: r dataframe intersect

启动单独的线程作为问题现在略有不同(R: split data frame rows by space, remove common elements, put unequal length columns in new df)。我有一个具有任意列数的数据框,并希望删除任何列不唯一的所有元素。建议是使用intersect但它只删除所有列中存在的元素(见下文)。我需要删除超过1列中看到的任何元素。并且需要一个矢量化解决方案 - 现在我可以做到但是真的很乏味地处理N个向量。 谢谢!

这个工作完成了工作,但仅适用于每一栏中的元素:

df1 = structure(list(A = structure(1:3, .Label = c("R1", "R2", "R3"), class = "factor"), 
                    B = c("1 4 78 5 4 6 7 0", 
                          "2 3 76 8 2 1 8 0", 
                          "4 7 1 2"
                    )), .Names = c("A", "B"), row.names = c(NA, -3L), class = "data.frame")


s <- strsplit(df1$B, " ")
## find the intersection of all s
r <- Reduce(intersect, s)
## iterate over s, removing the intersection characters in r
l <- lapply(s, function(x) x[!x %in% r])
## reset the length of each vector in l to the length of the longest vector
## then create the new data frame
zz = setNames(as.data.frame(lapply(l, "length<-", max(sapply(l, length)))), letters[seq_along(l)])

编辑。我道歉 - 应该包括所需的输出。这是:

Col1 Col2 Col3 
78 3 NA
5  76 NA
6  8 NA
NA 8 NA

2 个答案:

答案 0 :(得分:1)

您可以从每个列表中创建一个唯一值表,并删除计数大于1的表。

$scope.$on('$routeChangeStart', function(next, current) { 
 ... you could trigger something here ...
});

答案 1 :(得分:0)

也许

s <- strsplit(df1$B, " ")
n <- max(sapply(s,length))
M <- sapply(s,function(x){c(x,rep(Inf,n-length(x)))})
u <- unique(unlist(s))
r <- u[sapply(u,function(x){sum(rowSums(M==x)>0)>1})]

然后

> r
[1] "1" "4" "7" "2" "8"

是必须删除的元素。 &#34; Inf文件&#34;用于填补矩阵中的空白&#34; M&#34;有些东西不会出现在&#34; df1 $ B&#34;中。矩阵&#34; M&#34;转换为&#34; df1 $ B&#34;。因此我使用&#34; rowSums&#34;检查元素是否出现在&#34; df1 $ B&#34;的列中。如果字符串在&#34; df1 $ B&#34;意思是列,取代&#34; rowSums&#34; by&#34; colSums&#34;。