我需要做三件事:

1. Count the rowwise non NA's values in a table and sum them (in a single column "check_na")

[我把我的解决方案放在下面,如果有人能用map解决这个问题,我很感兴趣.我已经判断过了https://stackoverflow.com/questions/50680413/count-na-in-given-columns-by-rows【关于这个问题的答案】

2. For those values that are not NA, create a column that concatenates these the unique values in a new column "block detail".

[我不知道怎么做]

3. If "check_na" has a value then pull in the column name(s) and concatenate them in a new column ("block type")

[我不知道怎么做]

这就是最终产品的外观.

      w x     y     z     na_check block_detail block_type
  <dbl> <chr> <chr> <chr>    <int> <chr>        <chr>     
1    NA a     NA    NA           1 a            x         
2    NA NA    b     b            2 b            y|z       
3    NA NA    b     c            2 b|c          y|z       
4    NA NA    NA    NA           0 NA           NA        
5    NA NA    NA    b            1 b            z 

以下是示例数据和我对第1部分的解决方案:


#sample data
df <- tibble(w=rep(NA_real_,5),
       x=c(1,rep(NA_real_,4)),
       y=c(NA_real_,1,rep(NA_real_,3)),
       z=c(NA_real_,1,rep(NA_real_,2),1)
       )

#my solution to the first part, interested if someone can do this more efficiently or can do this with map as I have 100s columns that I need to do this with

df_na_check <- df %>% 
  mutate(across(everything(),
                list(na_check=~!is.na(.)),
                .names="{.col}_{.fn}")) %>% 
  rowwise() %>% 
mutate(na_check=sum(c_across(contains("na_check")))) %>% 
  select(w:z,na_check)

谢谢你的帮助.理想情况下,如果解决方案可以使用tidyverse,但可以使用其他方法(data.table或base r)

推荐答案

我们可以首先使用rowSums来获得不是NA的列数.然后,我们可以使用purrr将非NA的唯一字符折叠为block_detail.然后,我们可以使用apply遍历每一行,得到没有NA代表block_type的列名.

library(tidyverse)

df %>% 
  mutate(na_check = rowSums(!is.na(.), na.rm = T),
         block_detail = pmap_chr(select(., -na_check), ~paste0(unique(na.omit(c(...))), collapse = "|")),
         block_type = apply(df, 1, \(x) paste0(names(df)[which(!is.na(x))], collapse = "|")))

Output

   w    x    y    z na_check block_detail block_type
1 NA    a <NA> <NA>        1            a          x
2 NA <NA>    b    b        2            b        y|z
3 NA <NA>    b    c        2          b|c        y|z
4 NA <NA> <NA> <NA>        0                        
5 NA <NA> <NA>    b        1            b          z

或者用purrr而不是apply:

df %>% 
  mutate(na_check = rowSums(!is.na(.), na.rm = T),
         block_detail = pmap_chr(select(., -na_check), ~str_c(unique(na.omit(c(...))), collapse = "|"))) %>% 
  mutate(block_type = pmap_chr(select(., -c(na_check, block_detail)), ~str_c(names(c(...))[!is.na(c(...))], collapse="|")))

Data

df <- structure(list(w = c(NA, NA, NA, NA, NA), x = c("a", NA, NA, 
NA, NA), y = c(NA, "b", "b", NA, NA), z = c(NA, "b", "c", NA, 
"b")), class = "data.frame", row.names = c(NA, -5L))

R相关问答推荐

使用预定值列表将模拟数量(n)替换为rnorm()

在ggplot Likert条中添加水平线

行式dppr中的变量列名

使用gggrassure减少地块之间的空间

如何在RMarkdown LaTex PDF输出中包含英语和阿拉伯语?

有没有一个R函数允许你从一个数字变量中提取一个数字,而不考虑它的位置(不仅仅是第一个或最后一个数字?

为什么观察不会被无功值变化触发?

使用tidy—select创建一个新的带有mutate的摘要变量

如何使用tryCatch执行语句并忽略警告?

R中边际效应包中Logistic回归的交互作用风险比

有没有办法使用ggText,<;Sub>;&;<;sup>;将上标和下标添加到同一元素?

汇总数据的Sheffe检验的P值(平均值和标准差)

如何移除GGPlot中超出与面相交的任何格网像元

如何删除R中除数字元素以外的所有元素

在具有多个响应变量的比例堆叠条形图上方添加总计

防止正则表达式覆盖以前的语句

如何在内联代码中添加额外的空格(R Markdown)

整理ggmosaic图的标签

如何将字符类对象中的数据转换为R中的字符串

组合名称具有模式的列表的元素