【问题标题】:Using position in one list to read in file from another list in R使用一个列表中的位置从 R 中的另一个列表中读取文件
【发布时间】:2020-05-06 11:01:31
【问题描述】:

我有一个名为cities的城市名称向量:

> cities
[1] 'amsterdam' 'atlanta' 'bangalore'
[4] 'bogota' 'boston' 'brisbane'
[7] 'brussels' 'cairo' 'cape'

我有两个文件夹,其中存在相同的城市并以相同的方式排序。我已经把每个文件夹变成了一个列表。 list1 中的每个文件都包含一个城市的地理数据。 list2 中的每个文件都包含一个城市的旅行时间数据。

> list1
[[1]]
[1] "C:/geo/amsterdam.json"
[[2]]
[1] "C:/geo/atlanta.json"
[[3]]
[1] "C:/geo/bangalore.json"

> list2
[[1]]
[1] "C:/time/amsterdam.csv"
[[2]]
[1] "C:/time/atlanta.csv"
[[3]]
[1] "C:/time/bangalore.csv"

我想写一个循环,

  • 基于城市在cities中的位置,
  • list1读入对应的文件,
  • list2读入对应的文件,
  • 将两个数据集合并成一个数据集,其名称对应cities中的索引位置

类似的东西:

for (i in length(cities)){
geo <- (sf::st_read(list1[i])
time <- (data.table::fread(list2[i])
merged[i] <- merge(geo, time, by='id') #both datasets have an 'id' column
}

目前,此循环给出错误number of items to replace is not a multiple of replacement length。 当我尝试索引每个输出(即geo[i] &lt;- (sf::st_read(list1[i])...)时,我收到错误new columns would leave holes after existing columns

有没有办法根据这些元素(或它们的等价物)在另一个列表/向量中的位置对列表元素执行操作?

【问题讨论】:

  • 没有一些文件来重现我最好的建议是使用dplyr::inner_join() 类似:merged &lt;- list(); for (i in 1:length(cities)){ geo &lt;- (sf::st_read(list1[i])); time &lt;- (data.table::fread(list2[i])); merged[[i]} &lt;- dplyr::inner_join(geo, time, by='id') }

标签: r list for-loop vector


【解决方案1】:

解决方案是在循环之前初始化一个空列表,它将接收merged 数据帧:

merged=list()

for (i in length(cities)){
    geo <- (sf::st_read(list1[i])
    time <- (data.table::fread(list2[i])
    merged[i] <- merge(geo, time, by='id') #both datasets have an 'id' column
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-10-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-04
    • 1970-01-01
    • 2023-02-25
    相关资源
    最近更新 更多