在 R 中的数据框中的列的每个唯一值之后添加一个空白行

Posted

技术标签:

【中文标题】在 R 中的数据框中的列的每个唯一值之后添加一个空白行【英文标题】:Add a blank row after each unique value of a column in a dataframe in R 【发布时间】:2022-01-13 17:42:28 【问题描述】:

我想知道是否可以在下面我的data 中的每个唯一值 study 之后添加一个空白行?

下面是我的Desired_output

请注意,这是一个玩具数据。非常感谢功能性答案。

data <- data.frame(study=c(rep(1,2),2:3), year=c(rep(2001,2),2002:2003))

Desired_output =
" study year
1     1 2001
2     1 2001
             # <- Blank row
3     2 2002
             # <- Blank row
4     3 2003"

【问题讨论】:

见这里:***.com/questions/62007509/…> 【参考方案1】:

按等于 study 的新列分组,然后使用 group_modify 在每个组的末尾添加一行。最后删除 study2 和最后一行。

library(dplyr)

data %>%
 group_by(study2 = study) %>%
 group_modify(~ add_row(.)) %>%
 ungroup %>%
 select(-study2) %>%
 slice(-n())

给予:

# A tibble: 7 x 2
  study  year
  <dbl> <dbl>
1     1  2001
2     1  2001
3    NA    NA
4     2  2002
5    NA    NA
6     3  2003

【讨论】:

【参考方案2】:

这是一个基本的 R 解决方案:

data_new <- as.data.frame(lapply(data, as.character), stringsAsFactors = FALSE)
head(do.call(rbind, by(data_new, data$study, rbind, "")), -1)
    study year
1.1     1 2001
1.2     1 2001
1.3           
2.3     2 2002
2.2           
3.4     3 2003

【讨论】:

head(do.call(rbind, by(data, data$study, rbind, "")), -1) 似乎没有第一行就足够了。 感谢您的建议!【参考方案3】:

您可以使用group_split 将数据按组拆分为数据框列表。然后在每个列表元素上映射一个函数,并使用map_dfr 将它们的输出堆叠回一个数据框。

library(dplyr)
library(tibble)
library(purrr)

data %>% 
  group_split(study) %>% 
  map_dfr(~ add_row(.x, .after = Inf))

输出

  study  year
  <dbl> <dbl>
1     1  2001
2     1  2001
3    NA    NA
4     2  2002
5    NA    NA
6     3  2003
7    NA    NA

【讨论】:

超级有趣!只是好奇,如果我们想要添加两个 NA 行而不是一个 NA 行,应该改变什么? 然后我将用map_dfr(~ .x[1:(nrow(.x) + 2),]) 替换最后一行。然后你也不需要加载tibble 包。 非常感谢。有趣!

以上是关于在 R 中的数据框中的列的每个唯一值之后添加一个空白行的主要内容,如果未能解决你的问题,请参考以下文章

在数据框中查找包含NA的列的行?

在数据框中的特定位置添加列的优雅方式

在计算 Pandas 创建的数据框中的列的平均值时指定“跳过 NA”

Pyspark:如何将现有非空列的元组列表作为数据框中的列值之一返回

像 Qlik 一样计算 pandas 数据框中的列中的唯一值?

在具有循环或 lambda 的多个数据帧中添加具有相同字符串值的列的更有效方法?