我有一个清单' l'数据帧。这些数据帧本身就是二维矩阵。对于我的工作,我需要创建另一个列表,其中包含数据帧,这些数据帧是原始列表中数据帧的子集。
例如:列表l1具有两个数据帧D1和D2,分别具有10和12个不同的数据列。现在我想创建一个新的列表l2,它也有两个数据帧,但这些数据帧是从早期数据帧D1和D2中选出的列。请考虑D1和D2中同一列的位置可能不同,因此我必须通过列名而不是索引来访问它
有人可以建议我如何实现这个目标吗?
答案 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)]