【问题标题】:Pasting cell entries into one cell and deleting empty cells将单元格条目粘贴到一个单元格中并删除空单元格
【发布时间】:2020-01-10 15:20:23
【问题描述】:

我有以下问题: 我有一张有许多空单元格的表格。但第一列不包含空单元格。像这样:

structure(list(variable = c("variable", "Mean (M)", "Standard", 
"deviation", "(SD)", "1. Challenge"), M = c("M", "", "", "", 
"", "3.06"), SD = c("SD", "", "", "", "", "1.08"), X1 = c("1", 
"3.03", "1.09", "", "", ""), X2 = c("2", "2.19", "1.07", "", 
"", "â\210’0.06"), X3 = c("3", "1.93", "1.10", "", "", "0.52***"
), X4 = c("4", "1.86", "1.04", "", "", "â\210’0.14*")), row.names = c(NA, 
6L), class = "data.frame"))

How it looks like now

现在我想将标准(=“偏差”和“(SD)”)下的两个单元格的条目粘贴到单元格中,并删​​除这些仅包含空单元格的行。所以输出应该是这样的:

structure(list(variable = structure(c(2L, 3L, 1L), .Label = c("1. Challenge", 
"Mean (M)", "Standard deviation SD", "variable"), class = "factor"), 
    M = structure(c(1L, 1L, 2L), .Label = c("", "3.06", "M"), class = "factor"), 
    SD = structure(c(1L, 1L, 2L), .Label = c("", "1.08", "SD"
    ), class = "factor"), `1` = structure(c(4L, 3L, 1L), .Label = c("", 
    "1", "1.09", "3.03"), class = "factor"), `2` = structure(c(3L, 
    1L, 4L), .Label = c("1.07", "2", "2.19", "â\210’0.06"), class = "factor"), 
    `3` = structure(3:1, .Label = c("0.52***", "1.10", "1.93", 
    "3"), class = "factor"), `4` = structure(c(2L, 1L, 4L), .Label = c("1.04", 
    "1.86", "4", "â\210’0.14*"), class = "factor")), row.names = 2:4, class = "data.frame")

How I would like it to look like

你能帮忙吗? 谢谢!

【问题讨论】:

  • 您可以删除缺少数据的列,然后手动重命名该列。 df <- tidyr::drop_na(df, -variable); df[2,1] <- "Standard deviation SD".
  • 但这无济于事,因为问题不是NA,而是空白单元格!我试过这个:no_blank_Table <-Tab[!(Tab$SD==""), ] 但后来我也丢失了前几行。我想删除仅包含空白单元格的行(忽略第一列)。有什么想法吗?
  • 您可以使用 dplyr 轻松地将所有空白值转换为 NA:df <- mutate_all(df, ~ na_if(., ''))

标签: r cell paste


【解决方案1】:

一个选项是根据除第一列之外的所有列中出现的空白 ("") 创建一个分组列,然后当行数大于 1 时,每个列的元素 paste并获取distinct

library(dplyr)
library(stringr)
df1 %>% 
    group_by(grp = cumsum(rowSums(.[-1] == "") != ncol(.)-1))  %>%  
    mutate_at(vars(-group_cols()), ~ if(n() > 1) str_c(., collapse=" ") else .) %>%
    ungroup %>%
    type.convert(as.is = TRUE) %>%
    select(-grp) %>% 
    distinct

【讨论】:

  • 太棒了!非常感谢!不知道这是否需要,但我简化了一下:
    Table2 %>% group_by(grp = cumsum(rowSums(.[-1] == "") != ncol(.)-1)) %>% mutate_at(vars(-group_cols()), ~ if(n() > 1) str_c(., collapse=" ") else .) %>% unique(.) %>% .[-1, -10]
  • @Anne-KathrinKleine 谢谢。 type.convert 用于更改每列的类型(如果需要),unique 是类似于 distinct 的基础 R 来自 dplyr