R 合并数据框中具有不同值的多行
我是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 NAR 合并数据框中具有不同值的多行,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按原样合并,并将不
我希望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
df2lappy
对于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”))错误:与请求的类型不兼容