summary_at,其中1行仅包含R中的NA



目标是压缩列表的数据帧。

可复制示例

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
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
p>错误:列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值对相应列进行分组和筛选。

最新更新