我是R的新手,我想知道如何为大多数列合并多个具有相同列值的行。
例如:我有一个数据集:
v1 v2 v3 v4 2 3 4 5 2 3 5 NA
现在,我希望将结果视为:
v1 v2 v3 v4 2 3 NA NA
我希望按原样合并NA,将不同的字段合并为NA。
答案 0 :(得分:3)
如果您的数据框是df
:
apply(df, 2, function(u) ifelse(length(unique(u))==1, u[1], NA))
# v1 v2 v3 v4
#1 2 3 NA NA
回答子问题:
df = data.frame(col1=c(2,2,3),col2=c(3,3,3), col3=c(4,5,5), col4=c(5,NA,NA))
# col1 col2 col3 col4
#1 2 3 4 5
#2 2 3 5 NA
#3 3 3 5 NA
rbind(apply(df[1:2,], 2, function(u) ifelse(length(unique(u))==1, u[1], NA)),
df[3:nrow(df),])
# col1 col2 col3 col4
#1 2 3 NA NA
#3 3 3 5 NA
答案 1 :(得分:1)
我们可以尝试anyDuplicated
和sweep
来获得预期的输出
unique(sweep(df1, 2, NA^(sapply(df1, anyDuplicated)!=nrow(df1)),'*'))
# v1 v2 v3 v4
#1 2 3 NA NA
根据@Colonel Beauvel的帖子中的评论,我们可以从'模式'创建逻辑索引。 ' v1',对数据集进行子集,执行上述步骤,并rbind
。
df2 <- rbind(df1, c(3,3, 5, NA))
Mode <- function(x) {
ux <- unique(x)
ux[which.max(tabulate(match(x, ux)))]
}
indx <- with(df2, v1==Mode(v1))
rbind(unique(sweep(df2[indx,], 2, NA^(sapply(df2[indx,],
anyDuplicated)!=nrow(df2[indx,])), '*')), df2[!indx,])
# v1 v2 v3 v4
#1 2 3 NA NA
#3 3 3 5 NA
或者
df3 <- df2[indx,]
rbind(sapply(df3, function(x) unique(x *
NA^(anyDuplicated(x)!= nrow(df3)))), df2[!indx,])
# v1 v2 v3 v4
#1 2 3 NA NA
#3 3 3 5 NA
df1 <- structure(list(v1 = c(2L, 2L), v2 = c(3L, 3L), v3 = 4:5,
v4 = c(5L, NA)), .Names = c("v1", "v2", "v3", "v4"),
class = "data.frame", row.names = c(NA, -2L))
答案 2 :(得分:0)
将dplyr包与您的数据框data
一起使用:
library(dplyr)
data %>%
summarise_each(funs(ifelse(length(unique(.))>1,"NA",.)))
v1 v2 v3 v4
1 2 3 NA NA
如果您要将某些变量分组,而不是合并,则可以将它们指定为分组变量:
data %>%
group_by(v1, v2) %>% # the variables you want to group by
summarise_each(funs(ifelse(length(unique(.))>1,"NA",.)))
Source: local data frame [1 x 4]
Groups: v1
v1 v2 v3 v4
1 2 3 NA NA