如何在列表(R)中的数据帧中调用多个单元格?

时间:2017-11-03 17:46:48

标签: r list indexing dplyr

我在如何索引列表方面苦苦挣扎。我的数据(作为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

但是如果我想要经历多个元素,我怎么能这样做呢?谢谢!

2 个答案:

答案 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