如何从数据框列表中提取某些列

时间:2017-11-22 20:26:56

标签: r

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

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

有人可以建议我如何实现这个目标吗?

3 个答案:

答案 0 :(得分:3)

这是一个例子(这是你应该在你的问题中提出的那种情况。如果你能用一个清晰​​,可复制/可粘贴,可重现的例子来构建你的问题,你将获得近乎即时的帮助。)

<强>问题:

# 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)。它将结果返回到列表中。

答案 1 :(得分:1)

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

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

侨!

答案 2 :(得分:0)

我有一个21列的列表,我想扩展其中的范围,并创建一个包含1到7、11和21列的单独列表。

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