合并具有不同值的数据框中的多行
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
我们可以尝试 anyDuplicated
和 sweep
以获得预期的输出
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))
我是 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
我们可以尝试 anyDuplicated
和 sweep
以获得预期的输出
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))