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

时间:2015-03-21 14:06:36

标签: r merge duplicates

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

例如:我有一个数据集:

      v1    v2    v3   v4 
      2     3     4    5
      2     3     5    NA
 

现在,我希望将结果视为:

      v1    v2    v3   v4 
      2     3     NA    NA
 

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

3 个答案:

答案 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)

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

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