Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何调用列表(R)中数据帧中的多个单元格?_R_List_Indexing_Dplyr - Fatal编程技术网

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

如何调用列表(R)中数据帧中的多个单元格?,r,list,indexing,dplyr,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

我正在努力研究如何在列表中建立索引。我的数据(作为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
但这给了我一个错误“mutate_impl(.data,dots)中的错误”: 评估错误:递归索引在级别3失败”

如果我知道我想要列表中的哪个元素,我可以单独完成,例如

> dat[[1]][match(df$Time, dat[[1]]$Time), "Value"]
[1] 4.2 6.5 4.2 8.1
但是,如果我想通过多个元素,我该怎么做呢?谢谢

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


将列表放入长格式可能更容易:
l=data.table::rbindlist(dat,idcol=TRUE)
,这样更容易匹配或合并
l$Value[match(粘贴(粘贴(df$Place,df$Time),粘贴(l$.id,l$Time))]
(我确信至少在第二步中会有更多的
data.table
方式)将列表放入长格式可能更容易:
l=data.table::rbindlist(dat,idcol=TRUE)
,这将使匹配或合并更容易<代码>l$值[匹配(粘贴(df$位置,df$时间),粘贴(l$.id,l$时间))](我确信至少在第二步中会有更多的
数据表
方式)
> dat[[1]][match(df$Time, dat[[1]]$Time), "Value"]
[1] 4.2 6.5 4.2 8.1
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
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
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