【问题标题】:How to extract certain columns from a list of data frames如何从数据框列表中提取某些列
【发布时间】:2017-11-22 20:26:55
【问题描述】:

我有一个数据框列表“l”。这些数据帧本身就是二维矩阵。对于我的工作,我需要创建另一个列表,其中包含数据框,这些数据框是原始列表中数据框的子集。

例如:列表 l1 有两个数据帧 D1 和 D2,分别有 10 和 12 个不同的数据列。现在我想创建一个新列表 l2,它也有两个数据帧,但这些数据帧是从早期数据帧 D1 和 D2 中挑选出来的列。请考虑同一列在 D1 和 D2 中的位置可能不同,因此我必须通过列名而不是索引来访问它

有人可以建议我如何实施这个吗?

【问题讨论】:

  • lapply(l, <code for your subset>)。如果您想要更具体的代码,则需要提供比“基本上是 D1 和 D2 的子集”更具体的 D3 和 D4 描述。
  • 如果你想要第 1:5 行和第 2 和第 3 列,你可以做lapply(l, "[", 1:5, 2:3),但如果你有条件或其他东西,一个例子会有很长的路要走。
  • 我想从 D1 和 D2 中提取特定的列
  • 把它放在你的问题中!提出您的问题“我将如何提取名为 "X""MyFavoriteColumn" 的列?”或“我将如何提取第 2、第 4 和第 321 列?”或类似的东西。
  • 如果您向reproducible example 提供示例输入数据和所需的输出数据,它会更容易为您提供帮助。这样就可以测试和验证可能的解决方案。

标签: r


【解决方案1】:

这是一个示例(这是您应该在问题中提出的内容。如果您可以使用这样一个清晰、可复制/可粘贴、可重复的示例来构建您的问题,您将获得近乎即时的帮助。)

问题:

# list of data frames:
l = list(mtcars, mtcars)

# vector of column names I would like to extract
my_names = c("mpg", "wt", "am")
# these columns might be at different positions in the data frames

解决方案:

result = lapply(l, "[", , my_names)

# look at the top 6 rows of each to verify that it worked:
lapply(result, head)
# [[1]]
#                    mpg    wt am
# Mazda RX4         21.0 2.620  1
# Mazda RX4 Wag     21.0 2.875  1
# Datsun 710        22.8 2.320  1
# Hornet 4 Drive    21.4 3.215  0
# Hornet Sportabout 18.7 3.440  0
# Valiant           18.1 3.460  0
#
# [[2]]
#                    mpg    wt am
# Mazda RX4         21.0 2.620  1
# Mazda RX4 Wag     21.0 2.875  1
# Datsun 710        22.8 2.320  1
# Hornet 4 Drive    21.4 3.215  0
# Hornet Sportabout 18.7 3.440  0
# Valiant           18.1 3.460  0

解释:你基本上想做l[[1]][, my_names], l[[2]][, my_names], ... lapply 对每个列表元素应用一个函数。在这种情况下,函数是[,它以 rows 作为其第一个参数(我们将其留空以指示所有行),columns 作为其第二个参数(我们给它my_names)。它以列表的形式返回结果。

【讨论】:

  • 我不太明白[背后的逻辑,但我真的很感谢这个答案。
【解决方案2】:

你可以使用 dplyr,它很好,简单,语法清晰:

    library(dplyr)
    l <- list(mtcars, mtcars) # the list of 2 df
    new_list <- lapply(l, function(x) x%>% select(mpg,wt,am))

Ciao!

【讨论】:

  • 我得到“错误:select() 不处理列表。” ?
【解决方案3】:

我有一个包含 21 列的列表,我想从中提取并创建一个单独的列表,其中包含从 1 到 7、11 和 21 的列。这对我有用。

mydata <- read.csv("data.csv")
newdatalist <- data[c(1:7, 11, 21)]

【讨论】:

    猜你喜欢
    • 2022-01-13
    • 1970-01-01
    • 2021-08-23
    • 2017-08-27
    • 1970-01-01
    • 2021-12-08
    • 1970-01-01
    • 2019-11-15
    • 1970-01-01
    相关资源
    最近更新 更多