编写循环以通过在 R 中子集数据来创建多个数据帧

Writing a loop to create multiple dataframes by subsetting data in R

提问人:K.W 提问时间:11/10/2023 最后编辑:K.W 更新时间:11/10/2023 访问量:57

问:

我在以下方面遇到了问题:如果我想浏览我的数据帧并在指定时间(假设时间 = 11)将每个“剂量”的“生存”保存到每个线和性别组合中,到单独的数据帧中,然后保存每个数据帧,我该如何在 R 中做到这一点?

时间 生存 线 剂量
28 0.95 138 F 1
30 0.85 138 F 1
32 0.75 138 F 1
11 0.45 138 F 1
15 0.15 138 F 1
16 0.25 138 F 1
18 0.15 138 F 1
40 0.25 138 F 1
28 0.95 138 F 10
30 0.85 138 F 10
32 0.75 138 F 10
11 0.65 138 F 10
15 0.15 138 F 10
16 0.25 138 F 10
18 0.15 138 F 10
40 0.25 138 F 10
28 0.95 138 M 1
30 0.85 138 M 1
32 0.75 138 M 1
11 0.45 138 M 1
15 0.15 138 M 1
16 0.25 138 M 1
18 0.15 138 M 1
40 0.25 138 M 1
28 0.95 138 M 10
30 0.85 138 M 10
32 0.75 138 M 10
11 0.35 138 M 10
15 0.15 138 M 10
16 0.25 138 M 10
18 0.15 138 M 10
40 0.25 138 M 10
28 0.95 140 F 10
30 0.85 140 F 10
32 0.75 140 F 10
11 0.45 140 F 10
15 0.15 140 F 10
16 0.25 140 F 10
18 0.15 140 F 10
40 0.25 140 F 10
28 0.95 140 M 10
30 0.85 140 M 10
32 0.75 140 M 10
11 0.45 140 M 10
15 0.15 140 M 10
16 0.25 140 M 10
18 0.15 140 M 10
40 0.25 140 M 10

我希望生成的数据帧如下所示: 假设对于第 138 行 time=11 的女性:

生存 剂量
0.45 1
0.65 10

我想在我的数据帧中为 time=11 的每个线和性别组合执行此操作,并为每个线和性别组合的生存和剂量制作新的数据帧并保存它们。

R DataFrame for 循环

评论

0赞 Friede 11/10/2023
你要求用for循环来做吗?其他方法可能更像 R。
0赞 K.W 11/10/2023
我想使用最简单的方法。也许for循环不是最简单的?

答:

2赞 Friede 11/10/2023 #1

你可以像这样split()

ls_df <- split(data, list(data$Time, data$Line, data$Sex))

这是一个数据框列表。第一个看起来像

> ls_df[[1L]]
   Time Survival Line Sex Dose
4    11     0.45  138 F      1
12   11     0.65  138 F     10

请注意,某些数据框是空的,因为它们的因子组合不存在。我们应该如何处理这些问题?我建议删除它们:

ls_df <- ls_df[sapply(ls_df, \(x) dim(x)[1L]) > 0L]

如果确实要将剩余的列表条目复制到当前环境,请执行以下操作

list2env(x = ls_df, envir = environment())

如果您真的想将它们单独写入硬盘,一种选择是

path <- getwd() # path to your current directory 
invisible(
  lapply(
    X = names(ls_df), 
    FUN = \(i) write.csv(x = ls_df[[i]], file = paste0(file.path(path, i), ".csv"))
  )
)

您需要在上一步中将路径设置为您选择的目录,例如 。path <- getwd()


数据:

data <- structure(
  list(
    Time = c(
      "28",
      "30",
      "32",
      "11",
      "15",
      "16",
      "18",
      "40",
      "28",
      "30",
      "32",
      "11",
      "15",
      "16",
      "18",
      "40",
      "28",
      "30",
      "32",
      "11",
      "15",
      "16",
      "18",
      "40",
      "28",
      "30",
      "32",
      "11",
      "15",
      "16",
      "18",
      "40",
      "28",
      "30",
      "32",
      "11",
      "15",
      "16",
      "18",
      "40",
      "28",
      "30",
      "32",
      "11",
      "15",
      "16",
      "18",
      "40"
    ),
    Survival = c(
      "0.95",
      "0.85",
      "0.75",
      "0.45",
      "0.15",
      "0.25",
      "0.15",
      "0.25",
      "0.95",
      "0.85",
      "0.75",
      "0.65",
      "0.15",
      "0.25",
      "0.15",
      "0.25",
      "0.95",
      "0.85",
      "0.75",
      "0.45",
      "0.15",
      "0.25",
      "0.15",
      "0.25",
      "0.95",
      "0.85",
      "0.75",
      "0.35",
      "0.15",
      "0.25",
      "0.15",
      "0.25",
      "0.95",
      "0.85",
      "0.75",
      "0.45",
      "0.15",
      "0.25",
      "0.15",
      "0.25",
      "0.95",
      "0.85",
      "0.75",
      "0.45",
      "0.15",
      "0.25",
      "0.15",
      "0.25"
    ),
    Line = c(
      "138",
      "138",
      "138",
      "138",
      "138",
      "138",
      "138",
      "138",
      "138",
      "138",
      "138",
      "138",
      "138",
      "138",
      "138",
      "138",
      "138",
      "138",
      "138",
      "138",
      "138",
      "138",
      "138",
      "138",
      "138",
      "138",
      "138",
      "138",
      "138",
      "138",
      "138",
      "138",
      "140",
      "140",
      "140",
      "140",
      "140",
      "140",
      "140",
      "140",
      "140",
      "140",
      "140",
      "140",
      "140",
      "140",
      "140",
      "140"
    ),
    Sex = c(
      "F",
      "F",
      "F",
      "F",
      "F",
      "F",
      "F",
      "F",
      "F",
      "F",
      "F",
      "F",
      "F",
      "F",
      "F",
      "F",
      "M",
      "M",
      "M",
      "M",
      "M",
      "M",
      "M",
      "M",
      "M",
      "M",
      "M",
      "M",
      "M",
      "M",
      "M",
      "M",
      "F",
      "F",
      "F",
      "F",
      "F",
      "F",
      "F",
      "F",
      "M",
      "M",
      "M",
      "M",
      "M",
      "M",
      "M",
      "M"
    ),
    Dose = c(
      "1",
      "1",
      "1",
      "1",
      "1",
      "1",
      "1",
      "1",
      "10",
      "10",
      "10",
      "10",
      "10",
      "10",
      "10",
      "10",
      "1",
      "1",
      "1",
      "1",
      "1",
      "1",
      "1",
      "1",
      "10",
      "10",
      "10",
      "10",
      "10",
      "10",
      "10",
      "10",
      "10",
      "10",
      "10",
      "10",
      "10",
      "10",
      "10",
      "10",
      "10",
      "10",
      "10",
      "10",
      "10",
      "10",
      "10",
      "10"
    )
  ),
  class = "data.frame",
  row.names = c(NA,
                -48L)