目标是压缩列表的数据帧。
可复制示例
data <- data.frame(A = c(rep(111, 3), rep(222, 3)),
B = c(rep(c(100), 3), rep(200,3)),
C = rep(c(1,2,NA),2),
D = rep(c(1,2),3),
E = rep(c(NA,NA,NA),2))
data
p>错误:列A B C D E 1 111 100 1 1 NA 2 111 100 2 2 NA 3 111 100 NA 1 NA 4 222 200 1 2 NA 5 222 200 2 1 NA 6 222 200 NA 2 NA
E
的长度必须为1(摘要值(,而不是0
dataNew <- bind_rows(dataNew)
所需输出
DataNew
# A tibble: 2 x 5
# Groups: A [2]
A B C D E
<dbl> <dbl> <chr> <chr> <chr>
1 111 100 1,2 1,2,1 "Empty"
2 222 200 1,2 2,1,2 "Empty"
代码按预期工作,直到出现空列的情况。我尝试的解决方案让我困惑不已。
您可以将所需的逻辑封装在函数中,并将str_c
替换为您已经编写的代码的直接插件:
your_str_c <- function(x, collapse = ",") {
if (length(x) == 0) {
"empty"
} else {
stringr::str_c(x, collapse = collapse)
}
}
你会得到你想要的输出。
这里有一种方法:
# groupy and paste values
data[,list(paste(C[!is.na(C)], collapse = ','),
paste(D[!is.na(D)], collapse = ','),
paste("empty", paste(E[!is.na(E)], collapse = ','))),.(A,B)]
# set column names
colnames(data1) <- LETTERS[1:5]
print(data1)
A B V1 V2 V3
1: 111 100 1,2 1,2,1 empty
2: 222 200 1,2 2,1,2 empty
基本上,其思想是根据NA值对相应列进行分组和筛选。