Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/65.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 合并数据框中具有不同值的多行_R_Merge_Duplicates - Fatal编程技术网

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

R 合并数据框中具有不同值的多行,r,merge,duplicates,R,Merge,Duplicates,我是R新手,我想知道如何为大多数列合并具有相同列值的多行 例如:我有一个数据集: v1 v2 v3 v4 2 3 4 5 2 3 5 NA v1 v2 v3 v4 2 3 4 5 2 3 5 NA 现在,我想看到结果如下: v1 v2 v3 v4 2 3 NA NA v1 v2 v3 v4 2 3 NA NA 我希望NA按原样合并,并将不

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

例如:我有一个数据集:

v1 v2 v3 v4 2 3 4 5 2 3 5 NA v1 v2 v3 v4 2 3 4 5 2 3 5 NA 现在,我想看到结果如下:

v1 v2 v3 v4 2 3 NA NA v1 v2 v3 v4 2 3 NA NA
我希望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

如果您的数据帧是
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
将包与数据框
数据一起使用

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
将包与数据框
数据一起使用

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

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

unique(sweep(df1, 2,  NA^(sapply(df1, anyDuplicated)!=nrow(df1)),'*'))
#    v1 v2 v3 v4
#1    2  3 NA NA
更新 根据@collone beuvel的帖子下的评论,我们可以从“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

df2我们可以尝试
anyDuplicated
sweep
以获得预期的输出

unique(sweep(df1, 2,  NA^(sapply(df1, anyDuplicated)!=nrow(df1)),'*'))
#    v1 v2 v3 v4
#1    2  3 NA NA
更新 根据@collone beuvel的帖子下的评论,我们可以从“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


df2
lappy
对于
data.frame
可能更有意义,但这是一种简单的方法(+1)。谢谢@collone beuvel。我的下一个问题是:如果我有像上面那样的数据集,但我只想合并那些v1值相同的行,你建议我怎么做?(例如,假设第三行是(3,3,5,NA),那么结果应该包含两行:(2,3,NA,NA)和(3,3,5,NA))asnswer被编辑,只需使用rbind处理前两行,并在处理后与其他行连接!第二部分对行号进行硬编码。基本上,我想对col1进行分组。(对不起,我应该早点说清楚)
lappy
可能对
data.frame
更有意义,但这是一种简单的方法(+1)。谢谢你@collone beauvel。我的下一个问题是:如果我有像上面那样的数据集,但我只想合并那些v1值相同的行,你建议我怎么做?(例如,假设第三行是(3,3,5,NA),那么结果应该包含两行:(2,3,NA,NA)和(3,3,5,NA))asnswer被编辑,只需使用rbind处理前两行,并在处理后与其他行连接!第二部分对行号进行硬编码。基本上,我想对col1进行分组。(对不起,我应该早点说清楚)我收到了这个错误:“有趣的错误(左,右):二进制运算符的非数字参数”@SanthoshHegde我用我使用的数据更新了帖子,这些数据非常牵强和复杂,但sweep很好@SanthoshHegde使用dput数据集仍然会出错吗?@ColonelBeauvel实际上
任何重复的
都会很快,但复杂性在于将逻辑索引转换为
NAs
。谢谢你的评论。我得到了这个错误:“有趣的错误(左,右):二进制运算符的非数字参数”@SanthoshHegde我用我使用的数据更新了帖子,数据非常牵强和复杂,但是扫描很好@SanthoshHegde使用dput数据集仍然会出错吗?@ColonelBeauvel实际上
任何重复的
都会很快,但复杂性在于将逻辑索引转换为
NAs
。谢谢你的评论。谢谢@Sam。我遇到了一个问题。在我的例子中,有些列是“character”类的,有些是“numeric”,有些是“factor”。我试图根据ID进行分组,ID是数字的,NA字段也在数字列上。现在,您的代码给出了一个错误:data%%>%+group_by(id)%%>%#您要分组的变量+每个变量的摘要(funs(ifelse)(长度(唯一(.))>1,“NA”,))错误:与请求的类型不兼容谢谢@Sam。我遇到了一个问题。在我的例子中,有些列是“character”类的,有些是“numeric”,有些是“factor”。我试图根据ID进行分组,ID是数字的,NA字段也在数字列上。现在,您的代码给出了一个错误:数据%>%+分组依据(id)%>%\要分组依据的变量+每个变量的摘要(funs(ifelse(长度(唯一()>1,“NA”))错误:与请求的类型不兼容