我在如何索引列表方面苦苦挣扎。我的数据(作为data.frames列表)与此类似:
x <- data.frame(c(1,2,3,4,5), c(4.2,6.5,9.6, 9.3, 8.1)); names(x) <- c("Time", "Value")
y <- data.frame(c(1,2,3,4,5), c(8.5, 3.7, 5.4, 4.7, 9.2)); names(y) <- c("Time", "Value")
dat <- list(x, y); names(dat) <- c("place1", "place2")
> dat
$place1
Time Value
1 1 4.2
2 2 6.5
3 3 9.6
4 4 9.3
5 5 8.1
$place2
Time Value
1 1 8.5
2 2 3.7
3 3 5.4
4 4 4.7
5 5 9.2
其中dat是我拥有的数据形式,除了我的数据实际上有20个位置和数百万个时间点。我认为关键点是数据帧的名称与我想要引用的因子匹配。
我尝试构建的数据框在形式上类似于:
df <- data.frame(as.factor(c("place1", "place1", "place2", "place1")), c(1,2,1,5), c(NA, NA, NA, NA))
names(df) <- c("Place", "Time", "Value")
我尝试填充的数据框有地点,时间和其他一些变量,我想导入&#34;值&#34;来自我在dat中的数据。我尝试使用dplyr包:
df %>%
mutate(Value = as.vector(t(dat[[Place]][match(Time, dat[[Place]]$Time), "Value"])))
但是这给了我一个错误&#34; mutate_impl(.data,dots)中的错误: 评估错误:递归索引在级别3&#34;
时失败如果我知道列表中的哪个元素,我可以单独执行此操作,例如
> dat[[1]][match(df$Time, dat[[1]]$Time), "Value"]
[1] 4.2 6.5 4.2 8.1
但是如果我想要经历多个元素,我怎么能这样做呢?谢谢!
答案 0 :(得分:0)
df$Value = sapply(1:NROW(df), function(i) dat[[df$Place[i]]][["Value"]][df$Time[i]])
df
# Place Time Value
#1 place1 1 4.2
#2 place1 2 6.5
#3 place2 1 8.5
#4 place1 5 8.1
OR
merge(x = df[c("Place", "Time")],
y = do.call(rbind, lapply(names(dat), function(x) data.frame(Place = x, dat[[x]]))),
all.x = TRUE)
# Place Time Value
#1 place1 1 4.2
#2 place1 2 6.5
#3 place1 5 8.1
#4 place2 1 8.5
答案 1 :(得分:0)
do.call(rbind,lapply(names(dat),function(nm){merge(df[df$Place==nm,setdiff(colnames(df),"Value")],dat[[nm]],by=c("Time"))}))
Time Place Value
1 1 place1 4.2
2 2 place1 6.5
3 5 place1 8.1
4 1 place2 8.5