合并具有不同值的数据框中的多行

Merge multiple rows in a data frame with different values

我是 R 的新手,我想知道如何为大多数列合并具有相同列值的多行。

例如:我有一个数据集:

 v1 v2 v3 v4
      2 3 4 5
      2 3 5 不适用
 

现在,我希望看到的结果是:

 v1 v2 v3 v4
      2 3 不适用
 

我希望 NA 按原样合并,并将不同的字段转换为 NA。

如果你的数据帧是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

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

我们可以尝试 anyDuplicatedsweep 以获得预期的输出

unique(sweep(df1, 2,  NA^(sapply(df1, anyDuplicated)!=nrow(df1)),'*'))
#    v1 v2 v3 v4
#1    2  3 NA NA

更新

根据@Colonel Beauvel 的 post 下的评论,我们可以从 'v1' 的 'mode' 创建一个逻辑索引,对数据集进行子集化,执行上述步骤,然后 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))