我有类似的东西:
date pgm in.x logs out.y
20130514 na 12 j1 12
20131204 z2 03 j1 03
20130516 a01 04 j0 04
20130628 z1 05 j2 05
我注意到in和out值总是一样的,所以我想删除out.y列。我有其他这样的列,我希望能够检测匹配.x列的任何.y列,并在合并后删除它们。
答案 0 :(得分:10)
如果我们假设应删除所有列冗余
no_duplicate <- data_set[!duplicated(as.list(data_set))]
会做到这一点。
as.list
会将data.frame转换为其所有列的列表,duplicated
将返回那些列中所有值都与之前看到的列重复的列的索引。
这并不直接尝试比较.x和.y列,但具有保留每个重复列的一个副本的效果,我认为这是主要目标。另一方面,它还将删除与另一个.x列重复的任何.x列。
如果我们想保留所有.x列,即使是那些重复的列,一个好的解决方案可能是在合并之前过滤 。假设您将data_x
和data_y
合并为列&#34;标识符&#34;:
data_y_nonredundant <- data_y[!(as.list(data_y) %in% as.list(data_x) & names(data_y)!="identifier")]
data <- merge(data_x, data_y_nonredundant, by=c("identifier"))
答案 1 :(得分:0)
我为你的数据框创建了另一个变量,它是out.y
的副本x <- data.frame(date = c("20130514","20131204","20130516","20130628"),
pgm = c(NA, "z2", "a01", "z1"), in.x= c(12, 3, 4, 5), out.y= c(12, 3, 4, 5),new.y = c(12, 3, 4, 5))
y <- x[grepl(".x|.y",colnames(x))]
in.x out.y new.y
1 12 12 12
2 3 3 3
3 4 4 4
4 5 5 5
y$in.x==y[,c("out.y","new.y")]
out.y new.y
[1,] TRUE TRUE
[2,] TRUE TRUE
[3,] TRUE TRUE
[4,] TRUE TRUE
x <- x[,1:3]
date pgm in.x
1 20130514 <NA> 12
2 20131204 z2 3
3 20130516 a01 4
4 20130628 z1 5
答案 2 :(得分:-3)
我们同事的这些答案无疑是正确的,但更简单的方式是:
dataframe[,5] <- NULL