函数使用R中的索引号获取另一个变量值

zd287kbt  于 2023-03-15  发布在  其他
关注(0)|答案(2)|浏览(145)

我想请你帮助如何获得变量值从其他 Dataframe 位于列表内使用索引号。
我在R中有2个列表,每个列表包含2000万个 Dataframe 。
第一个列表,我们称之为列表A:视图(A)包含:
1( Dataframe )[10 x1]
2( Dataframe )[200 x1]
3( Dataframe )[80 x1]
...
20000( Dataframe )[1000 x1]
让我们放大数据框(1):
| 行号|识别号|
| - ------|- ------|
| 1个|巴黎|
| 第二章|伦敦|
| 三个|雅加达|
| 四个|孟买|
| 五个|曼彻斯特|
| 六个|河内|
| 七|悉尼|
| 八个|纽约|
| 九|米兰|
| 十个|首尔|
请注意“行号不是列”,而是每一行的行名称(实际上并不存在)。我只是想明确一个概念。
这是我的第二个列表B:视图(A)包含:
1( Dataframe )[3x 3]
2( Dataframe )[77 x5]
3( Dataframe )[5x 6]
...
20000( Dataframe )[888 x1]
两个列表(A和B)的数据框名称相同,但列数不同。列表A中的数据框仅包含一列(ID),但列表B中的数据框可以包含多列。
我们来看一下B中的 Dataframe 1
| 1英寸|平方英寸|三分之一|
| - ------|- ------|- ------|
| 1个|三个|不适用|
| 八个|不适用|不适用|
| 九|五个|不适用|
列表B中每个数据框中的值是列表A中的索引号。目标是使用这些值,我需要从每个同名数据框中获取ID值(例如:来自列表B的 Dataframe 888只能与来自列表A的 Dataframe 888匹配)。
下面是我们从 Dataframe 1重新获取示例的预期结果:
| 1英寸|平方英寸|三分之一|
| - ------|- ------|- ------|
| 巴黎|雅加达|不适用|
| 纽约|不适用|不适用|
| 米兰|曼彻斯特|不适用|
我可以通过使用需要很多时间的叠瓦循环来得到这个结果,因为我知道每个列表中有20000个 Dataframe ,迭代每个元素、行和列需要很多时间。
你能帮我解决这个问题吗?特别是减少执行时间?
我先谢谢你。

zqry0prt

zqry0prt1#

另一种方法:

f <- \(a,b) {
  d = dim(b)
  setNames(data.frame(matrix(a[as.matrix(b)],nrow = d[1], ncol=d[2])), names(b))
} 

# using Map -- thanks Ben Bolker
Map(f,A,B)

输出:

$d1
      in_1       in_2 in_3
1    paris    jakarta <NA>
2 new york       <NA> <NA>
3    milan manchester <NA>

$d2
  in_1 in_2 in_3   in_4
1  cat  dog fish   <NA>
2 frog <NA>  pig    rat
3 bird  cow <NA> monkey

输入:

A = list(d1 = structure(list(ID = c("paris", "london", "jakarta", 
"mumbai", "manchester", "hanoi", "sydney", "new york", "milan", 
"seoul")), class = "data.frame", row.names = c(NA, -10L)), d2 = structure(list(
    ID = c("cat", "fish", "dog", "horse", "cow", "pig", "goose", 
    "frog", "bird", "rat", "monkey")), class = "data.frame", row.names = c(NA, 
-11L)))

B = list(d1 = structure(list(in_1 = c(1, 8, 9), in_2 = c(3, NA, 5
), in_3 = c(NA, NA, NA)), class = "data.frame", row.names = c(NA, 
-3L)), d2 = structure(list(in_1 = c(1, 8, 9), in_2 = c(3, NA, 
5), in_3 = c(2, 6, NA), in_4 = c(NA, 10, 11)), class = "data.frame", row.names = c(NA, 
-3L)))
qyyhg6bp

qyyhg6bp2#

我不太确定,但我想这是你想要的?

myfun <- function(df1, df2) {
   data.frame(in_1 = df1$ID[df2$in_1], in_2 = df1$ID[df2$in_2], 
              in_3 = df2$in_3)
}
Map(myfun, A, B)

相关问题