我有一个数据框列表,可以使用帮助理解调用某些数据的约定,因为我的电线交叉了。 我试图将多个数据帧中的多个列组合成一个数据帧,最后我将主要使用折线图来说明一段时间内的趋势。但是,我一直试图制作一个数据框。
以下是一些示例数据,它们将在列表中创建两个数据框,代表我的数据结构:
ValueID <- c(1610, 1638, 1651, 1652, 1741, 1748, 1759, 1761, 1766)
Area <- c(136300, 73900, 230000, 178700, 54700, 4500, 120000, 3400, 45000)
Dep2001 <- c(6.14, 5.02, 5.84, 5.84, 4.69, 6.84, 5.09, 5.34, 7.84)
Dep2002 <- c(8.23, 7.11, 7.93, 7.93, 6.78, 8.93, 7.18, 7.43, 9.93)
a <- data.frame(ValueID, Area, Dep2001)
b <- data.frame(ValueID, Area, Dep2002)
aa <- list(a, b)
names(aa) <- c("a", "b")
我正在尝试使用Value {,Area,Dep2001,Dep2002,Dep2003等创建一个数据框(如您所见,每个数据框在ValueID
中都有一个公共ID字段),使用{ {1}}函数或apply
循环从数百个数据框的列表中添加列Dep2001,Dep2002等。
我是这样开始的:
for
...但我不认为我在这里正确。
所以,我试图弄清楚如何调用所有“Dep”列的列表(它们也总是第三列)。但是,虽然q <- names(aa)
bb <- as.data.frame(aa[[1]][c(1:2)])
apply(bb, q, cbind, aa)
调用第一个数据帧的第三列而aa[[1]][3]
调用前两个数据帧,但我无法获得某种类型的组合来调用每个数据帧的列表。每个数据框中的第三个/ Dep列;这是我尝试过的一个不起作用的例子:
aa[c(1:2)]
我对R来说还是个新手,对编程很新,所以可能有一个非常基本的解决方案。感谢。
答案 0 :(得分:0)
这将返回dfs列表第三列的值列表:
bb = lapply(aa, function(x) x[,3])
答案 1 :(得分:0)
如果Area
和ValueID
总是在所有data.frame
s
res <- data.frame(ValueID, Area, as.data.frame(lapply(aa, `[`, 3)))
apply
函数将参数作为列表,因此您通常不需要创建匿名函数。在这种情况下,函数是[
,其中一个子集函数,你传递参数&#34; 3&#34;,告诉它取第三列。如果Area
和ValueID
未排序,您可以按照建议使用Reduce
和merge
。
编辑:因为您的data.frames
有不同的行
Reduce(function(a, b) merge(a, b, by=c("ValueID", "Area"), all=T), aa)
答案 2 :(得分:0)
如果您有很多数据框,也许您可以尝试使用rbindlist转换为一个数据集,然后使用dcast.data.table将其转换为行格式。
类似的东西:
data <- rbindlist(aa)
data[, type := paste0("Dep", floor(seq(from = 2001, to = 2003-0.001, by = 1/9)))]
dcast.data.table(data, ValueID + Area ~ type, value.var = "Dep2001", fun = mean)