【问题标题】:R combine rows with single column entry into new rowR将具有单列条目的行合并到新行中
【发布时间】:2022-11-04 09:57:19
【问题描述】:

如何将任何行与单个列条目组合到新列中的单个组合输入中?例如当 A 列有值,但 B-C 为空时,我想将行条目合并到 D 列中的单个输入中。

原始 txt 文件如下所示:

A|B|C 
1|2|3
1
text
2
[end]
4|5|6
2
1
[end]
df <-read.delim("file.txt", header=TRUE, sep="|", blank.lines.skip = TRUE)

    A B C
    1 2 3  
    1
    text
    2
    [end]
    4 5 6
    2
    1
    [end]

需要新添加的列 D 的数据表:

    A B C D
    1 2 3 1 text 2 [end]
    4 5 6 2 1 [end]

我想这将是 is.na 和 mutate 函数的组合,但一直无法找到解决方案。该代码还可以包含 ends_with("[end]") 因为我要组合的每一行都以该文本结尾。对此有什么想法吗?

【问题讨论】:

  • 这是一个现有的数据框,还是您正在阅读源 CSV 文件或什么?当前如何存储数据?
  • 只是为了确定:这就是你的df 的样子吗:df &lt;- data.frame( A = c(1,1, "text", 2, "[end]", 4), B = c(2, "", "", "", "", 5), C = c(3, "", "", "", "", 6) )
  • 原始数据源是一个TXT文件,即“|”分开,但每行的最后一列条目包含换行符,导致该列的每个输入都作为新行输入,而不是全部放入最后一列。显示的数据框是使用 df <- read.delim(df.txt, header =TRUE, sep = "|") 上传的 txt 文件的简化示例。 df 中的每一行代表一个人,最后一列是具有换行符的文本报告。因此,我对换行符的解决方案是按照上述合并它们

标签: r dplyr mutate


【解决方案1】:

鉴于有关您的数据结构的问题尚未得到解答,不确定这是否是您所需要的:

library(tidyverse)    
df %>%
  # change empty cells to NA:
  mutate(across(everything(), ~na_if(., ""))) %>%
  # filter rows with NA:
  filter(if_any(everything(), is.na)) %>%
  # contract rows in new column `D`:
  summarise(D = str_c(A, collapse = " ")) %>%
  # bind original `df` (after mutations) to result:
  bind_cols(df %>%
              mutate(across(everything(), ~na_if(., ""))) %>%
              filter(!if_any(everything(), is.na)), .) %>%
  # remove duplicated values in `D`:
  mutate(D = ifelse(duplicated(D), NA, D))
  A B C              D
1 1 2 3 1 text 2 [end]
2 4 5 6           <NA>

数据:

df <- data.frame(
  A = c(1,1, "text", 2, "[end]", 4),
  B = c(2, "", "", "", "", 5), 
  C = c(3, "", "", "", "", 6)
  )

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-08-18
    • 2013-01-17
    • 2018-08-14
    • 2022-12-21
    • 1970-01-01
    • 2021-03-31
    • 1970-01-01
    • 2022-10-26
    相关资源
    最近更新 更多