【问题标题】:using a for loop to create a list of data frames in R使用 for 循环在 R 中创建数据框列表
【发布时间】:2014-03-31 13:44:24
【问题描述】:

我有一个包含 26 个数据框的列表。我正在使用下面的代码来创建一个向量。有没有办法可以使用 for 循环对所有 26 个数据帧应用相同的唯一函数,并在每个数据帧中创建一个包含 26 个数据帧的新列表?每个数据框将根据该数据框创建不同的向量。

(unique(paste(list[[1]]$row, list[[1]]$col, sep=""))

> (unique(paste(list[[1]]$row, list[[1]]$col, sep="")))
 [1] "A1"  "A2"  "A3"  "A5"  "A6"  "A7"  "A8"  "A9"  "A10" "A11" "A12" "B1"  "B2"  "B3"  "B4"  "B5"  "B6"  "B7"  "B8"  "B9" 
[21] "B10" "B11" "B12" "C1"  "C2"  "C3"  "C4"  "C5"  "C6"  "C7"  "C8"  "C9"  "C10" "C11" "C12" "D1"  "D2"  "D3"  "D4"  "D5" 
[41] "D6"  "D7"  "D8"  "D9"  "D10" "D11" "D12" "E1"  "E2"  "E3"  "E4"  "E5"  "E6"  "E7"  "E8"  "E9"  "E10" "E11" "E12" "F1" 
[61] "F2"  "F3"  "F4"  "F5"  "F6"  "F7"  "F8"  "F9"  "F10" "F11" "F12" "G1"  "G2"  "G3"  "G4"  "G5"  "G6"  "G7"  "G8"  "G9" 
[81] "G10" "G11" "G12" "H1"  "H2"  "H3"  "H4"  "H5"  "H6"  "H7"  "H8"  "H9"  "H10" "H11" "H12"

所以我想要的结果是......

[[1]]
[1] "A1"  "A2"  "A3"  "A5"  "A6"  "A7"  "A8"  "A9"  "A10" "A11" "A12" "B1"  "B2"  "B3"  "B4"  "B5"  "B6"  "B7"  "B8"  "B9" 
[21] "B10" "B11" "B12" "C1"  "C2"  "C3"  "C4"  "C5"  "C6"  "C7"  "C8"  "C9"  "C10" "C11" "C12" "D1"  "D2"  "D3"  "D4"  "D5" 
[41] "D6"  "D7"  "D8"  "D9"  "D10" "D11" "D12" "E1"  "E2"  "E3"  "E4"  "E5"  "E6"  "E7"  "E8"  "E9"  "E10" "E11" "E12" "F1" 
[61] "F2"  "F3"  "F4"  "F5"  "F6"  "F7"  "F8"  "F9"  "F10" "F11" "F12" "G1"  "G2"  "G3"  "G4"  "G5"  "G6"  "G7"  "G8"  "G9" 
[81] "G10" "G11" "G12" "H1"  "H2"  "H3"  "H4"  "H5"  "H6"  "H7"  "H8"  "H9"  "H10" "H11" "H12"

[[2]]
[1] "A1"  "A2"  "A3"  "A5"  "A6"  "A7"  "A8"  "A9"  "A10" "A11" "A12" "B1"  "B2"  "B3"  "B4"  "B5"  "B6"  "B7"  "B8"  "B9" 
[21] "B10" "B11" "B12" "C1"  "C2"  "C3"  "C4"  "C5"  "C6"  "C7"  "C8"  "C9"  "C10" "C11" "C12" "D1"  "D2"  "D3"  "D4"  "D5" 
[41] "D6"  "D7"  "D8"  "D9"  "D10" "D11" "D12" "E1"  "E2"  "E3"  "E4"  "E5"  "E6"  "E7"  "E8"  "E9"  "E10" "E11" "E12" "F1" 
[61] "F2"  "F3"  "F4"  "F5"  "F6"  "F7"  "F8"  "F9"  "F10" "F11" "F12" "G1"  "G2"  "G3"  "G4"  "G5"  "G6"  "G7"  "G8"  "G9" 
[81] "G10" "G11" "G12" "H1"  "H2"  "H3"  "H4"  "H5"  "H6"  "H7"  "H8"  "H9"  "H10" "H11" "H12"

[[3]] 
[1] "E10" "E11" "E12" "F1"  "F2"  "F3"  "F4"  "F5"  "F6"  "F7"  "F8"  "F9"  "F10" "F11" "F12" "G1"  "G2"  "G3"  "G4"  "G5" 
[21] "G6"  "G7"  "G8"  "G9"  "G10" "G11" "G12" "H1"  "H2"  "H3"  "H4"  "H5"  "H6"  "H7"  "H8"  "H9"  "H10" "H11" "H12"

etc etc until [[26]]

澄清

每个数据框包含以下列表包含的任何或所有元素(以下列表有 96 个元素):

list(c(paste0(rep(LETTERS[1:8], each=12), rep(1:12, 8))))

所以我需要一些能够遍历我的 26 个数据框列表并告诉我每个数据框包含的元素的东西。因为某些数据框可能没有全部 96 个元素,所以我展示了 [[3]] 在我想要的结果示例中只有 .. 40 个元素。希望现在更清楚..

【问题讨论】:

  • 使用lapply。它专为此类任务而设计。
  • @Roland 是这样的吗? lapply(list, function(x) unique(paste(list[[i]]$row, list[[i]]$col, sep=""))) 现在它给了我列表的数据框,但是向量它返回的与原始列表的每个数据框都不对应。
  • 差不多。 lapply(list, function(x) unique(paste0(x$row, x$col)))

标签: r list for-loop dataframe unique


【解决方案1】:

类似:

lapply(list, function(x) unique(do.call(paste0, x)))

应该这样做。 do.call 调用它的第一个参数(在本例中为函数paste0),参数设置为do.call 的第二个参数。由于x 是一个数据框,它是一个列表,所以效果很好。这是示例输出:

[[1]]
[1] "G18" "J20" "N12" "U11" "E1" 

[[2]]
[1] "F10" "E14" "Q18" "I7"  "X13"

[[3]]
[1] "Y8"  "F1"  "P7"  "C15" "Z6" 

[[4]]
[1] "M14" "O16" "L2"  "E13" "S7" 

[[5]]
[1] "V16" "Q1"  "S9"  "M13" "L12"

以及我使用的数据:

set.seed(1)
list <- replicate(5, data.frame(row=sample(LETTERS, 5), col=sample(1:20, 5)), s=F)
lapply(list, function(x) do.call(paste0, x))

【讨论】:

    【解决方案2】:

    我不明白你的数据结构,所以请原谅我的假数据集。

    您也可以在lapply 函数中使用transform

    df1 <- data.frame(a = c(1, 2, 3),
                      b = c(4, 5, 6))
    
    df2 <- data.frame(a = c(5, 6, 7),
                      b = c(8, 9, 10))
    
    dfList <- list(df1 = df1, df2 = df2)
    
    lapply(dfList, transform, c = a - b)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-08-15
      • 2020-07-18
      • 1970-01-01
      • 2016-05-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多