通过在 Excel 中为每个主题创建工作表,从 R 数据帧中导出缺失的数据

export missing data from an R dataframe by creating a sheet for each subject in excel

提问人:lM__3 提问时间:11/7/2023 更新时间:11/7/2023 访问量:58

问:

我想通过为每个主题制作一张工作表来导出 excel 文件中缺少数据的列。

例如,我有一个数据帧,如下所示:

编号 Sexe 年龄
1 1
2 2 28
3 32

对于主题 1,我们将在第 1 个 excel 工作表中有如下内容:

编号 Sexe 年龄
1 1

对于主题 3,这个:

编号 Sexe 年龄
3 32

因此,主题 2 不会有工作表,因为没有缺少任何数据。

你认为这可能吗?

下面是生成 df 的代码:

ID <- c(1, 2, 3)
sexe <- c(1, 2, NA)
age <- c(NA,28,32)

df <- data.frame(ID, sexe, age)

实际上,我有一个更大的数据帧,所以我会想要一些自动化的东西

提前感谢您的帮助

r excel

评论

0赞 zx8754 11/7/2023
阅读相关内容complete.cases
0赞 lM__3 11/7/2023
是的,谢谢你的回答!

答:

2赞 Friede 11/7/2023 #1

你可以试试

# required package
library(openxlsx)

# define a function 
df_to_xlsx <- function(df, split_variable) {
  stopifnot(is.data.frame(df))
  
  df <- df[!complete.cases(df), ] 
  ls <- split(df, f = split_variable)
  ls <- ls[sapply(ls, nrow) > 0L]
  names(ls) <- paste0("Subject_", names(ls))
  # please specify your path, e.g. getwd() + file name.xlsx
  openxlsx::write.xlsx(ls, file = "mydata.xlsx", 
                       keepNA = TRUE, na.string = "NA") 
}

# use function 
df_to_xlsx(df = df, split_variable = ID)

创建于 2023-11-07 使用 reprex v2.0.2

这将发出警告

#> split.default(x = seq_len(nrow(x)), f = f, drop = drop, ...): data 中的警告 #> length 不是 split 变量的倍数

由于 ID 级别 (3) 的数量不等于 (2) 创建的列表的长度。这是因为我们首先用完整的案例进行子集化,这删除了 的记录,因为它不包含任何 s。split()ID == 2NA

管道方法:

df[!complete.cases(df), ] |>
  split(f = ID) |>
  { \(x) x[sapply(x, nrow) > 0L]}() |> 
  { \(x) setNames(object = x, nm = paste0("Subject_", names(x)))}() |>
  openxlsx::write.xlsx(x = _, file = "mydata.xlsx", 
                       keepNA = TRUE, na.string = "NA")