对于每一行,将数字大于 0 的单元格放入列列表中

汤姆

我的数据如下:

dat <- structure(list(rn = c("A", "B", "C", 
"D", "E"), `[0,25)` = c("40 (replaced)", 
"52 (replaced)", "5", "2", "5 (replaced)"), `[25,50)` = c("0 (replaced)", 
"0 (replaced)", "0 (replaced)", "0 (replaced)", "0 (replaced)"), `[25,100)` = c("5", 
"3", "38", "2", "1"), `[50,100)` = c("0 (replaced)", "0 (replaced)", 
"0 (replaced)", "0 (replaced)", "0 (replaced)")), row.names = c(NA, 
-5L), class = c("data.table", "data.frame"))

   rn        [0,25)      [25,50) [25,100)     [50,100)
1:  A 40 (replaced) 0 (replaced)        5 0 (replaced)
2:  B 52 (replaced) 0 (replaced)        3 0 (replaced)
3:  C             5 0 (replaced)       38 0 (replaced)
4:  D             2 0 (replaced)        2 0 (replaced)
5:  E  5 (replaced) 0 (replaced)        1 0 (replaced)

我可以简单地得到如下数字:

    dat <- t(apply(dat, 1, extract_numeric))
    dat <- as.data.frame(dat )
    dat <- dat %>% 
        rowwise() %>% 
        summarise(V1 = V1, freq =list(c_across(-V1))) %>% 
        rowwise() %>% 
        mutate(freq = list(freq[which(freq > 0)]))

dat_out <- structure(list(V1 = c(NA_real_, NA_real_, NA_real_, NA_real_, 
NA_real_), freq = list(c(40, 5), c(52, 3), c(5, 38), c(2, 2), 
    c(5, 1))), class = c("rowwise_df", "tbl_df", "tbl", "data.frame"
), row.names = c(NA, -5L), groups = structure(list(.rows = structure(list(
    1L, 2L, 3L, 4L, 5L), ptype = integer(0), class = c("vctrs_list_of", 
"vctrs_vctr", "list"))), row.names = c(NA, -5L), class = c("tbl_df", 
"tbl", "data.frame")))

在此处输入图像描述

但是,如果我也想保留文本,我应该怎么做呢?

期望的输出:

freq
c("40 (replaced)","5")
c("52 (replaced)","3")
c("5","38")
c("2","2")
c("5 (replaced)","1")
阿克伦

在使用 'value' 列中具有 '0' 值的行使用正则表达式匹配,然后按 'rn' 分组后pivot_longer使用 'long' 格式可能会更容易filtersummariselist

library(dplyr)
library(tidyr)
library(stringr)
out <- dat %>% 
   pivot_longer(cols = -rn) %>% 
   filter(str_detect(value, '\\b0\\b', negate = TRUE)) %>% 
   group_by(rn) %>% 
   summarise(freq = list(value), .groups = 'drop')

-输出

> out
# A tibble: 5 × 2
  rn    freq     
  <chr> <list>   
1 A     <chr [2]>
2 B     <chr [2]>
3 C     <chr [2]>
4 D     <chr [2]>
5 E     <chr [2]>
> out$freq
[[1]]
[1] "40 (replaced)" "5"            

[[2]]
[1] "52 (replaced)" "3"            

[[3]]
[1] "5"  "38"

[[4]]
[1] "2" "2"

[[5]]
[1] "5 (replaced)" "1"        

或者另一种选择是replace使用 0 到 的列元素NA,然后unite到单个列,指定and 如果需要,在分隔符上na.rm = TRUE拆分为listwithstrsplit,

dat %>% 
   mutate(across(-rn, ~ replace(.x,
        str_detect(.x, '\\b0\\b'), NA_character_))) %>% 
   unite(freq, -rn, na.rm = TRUE, sep=",") %>% 
   mutate(freq = strsplit(freq, ","))
       rn            freq
   <char>          <list>
1:      A 40 (replaced),5
2:      B 52 (replaced),3
3:      C            5,38
4:      D             2,2
5:      E  5 (replaced),1

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

将数据帧中的行替换为0,且前一行的值大于0

用pandas将数据单元格用0夹在Python中

Excel:如何计算每n个单元格,无论该值是大于还是小于0

Excel:如何计算每n个单元格,无论该值是大于还是小于0

将值数组放入数据框内的单元格中

如果单元格为空,则计数大于0的单元格

如何计算单元格直到值大于0?

ArrayFormula可以将非空白单元格中的空白单元格编号为0到n

如果同一行中的另一个单元格的值大于0,则仅索引另一张工作表中一列的单元格

使用closedXML和C#将一系列单元格值放入列表中

将TextBox值插入列中的第一个空单元格

Excel FILTER()对于空白单元格返回0

如何将Dataframe作为R中的列表放入一个单元格

如何将字符串列表分成一行/单元格中的几行?

如何修改Google App查询公式,以将特定列的每一行中的空单元格转换为数字格式?

VBA替换值大于0的变量范围,具体取决于行中第一列的单元格值

从包含大于5000的数字的文本文件中复制每一行

当searchBar文本大于0时删除单元格

在Matlab中单元格内容索引必须大于0错误

Excel-如果6个单元格中的任何一个> 0,则除以该单元格数

对于文件中的每一行将行写入 python 中的单个文件

在列中的每个单元格中检查谷歌表中大于 0 的数字

当单元格值为 0 或公式中不存在时,如何将单元格留空

一个单元格中的单元格值 IF > 0

无法将函数放入列表中

使用 csvHelper 将单元格内容读入列表或数组

Excel - 计算有多少单元格的值大于 0

如何将每一行中的最大值以及所有其他数字保留为 0

从数据表行中获取值并将其作为 R 中的列表放入单元格中