r-根据同一数据帧中的另一个变量+另一个较小的数据帧填充变量的值



我有两个数据帧:

称为df:的主数据帧

variable     value n p
1          1 0.4457915 0 0
2          1 0.3573796 0 0
3          1 0.4809338 0 0
4          7 0.4707770 0 0
5          2 0.4617186 0 0
6          1 0.4330623 0 0
7          1 0.4426557 0 0
8          1 0.5265566 0 0
9          1 0.4606076 0 0
10         3 0.4150958 0 0
11         1 0.4459441 0 0
12         1 0.4143590 0 0
13         1 0.4344068 0 0
14         5 0.3259516 0 0
15         1 0.4202466 0 0
16         1 0.3120299 0 0
17         1 0.3938266 0 0
18         1 0.5133825 0 0
19         1 0.3331676 0 0
20         1 0.5563704 0 0

另一个称为cheatsheat:的较小数据帧

X1    X2
1   10 0.000
2   10 0.200
3   10 0.800
4   10 0.999
5   30 0.000
6   30 0.200
7   30 0.800
8   30 0.999
9  100 0.000
10 100 0.200
11 100 0.800
12 100 0.999
13 200 0.000
14 200 0.200
15 200 0.800
16 200 0.999

我试图完成的是基于变量"0"填充主数据帧CCD_ 3中的n和p;变量";(其范围从1到16,与数据帧cheatsheat中的行数相同(以及日期帧cheatsheat中的X1和X2的值。

这意味着输出应该是这样的:

variable     value  n   p
1          1 0.4457915 10 0.0
2          1 0.3573796 10 0.0
3          1 0.4809338 10 0.0
4          7 0.4707770 30 0.8
5          2 0.4617186 10 0.2
6          1 0.4330623 10 0.0
7          1 0.4426557 10 0.0
8          1 0.5265566 10 0.0
9          1 0.4606076 10 0.0
10         3 0.3201487 10 0.8
11         1 0.4459441 10 0.0
12         1 0.4143590 10 0.0
13         1 0.4344068 10 0.0
14         5 0.3259516 30 0.0
15         1 0.4202466 10 0.0
16         1 0.3120299 10 0.0
17         1 0.3938266 10 0.0
18         1 0.5133825 10 0.0
19         1 0.3331676 10 0.0
20         1 0.5563704 10 0.0

我已经用以下for循环实现了这一点:

for (i in 1:nrow(df)) {
df[i, "n"] <- cheatsheat[df[i, "variable"], "X1"]
df[i, "p"] <- cheatsheat[df[i, "variable"], "X2"]
}

然而,你们在主数据帧中只看到20行,而实际上我有20多万行。这意味着完成剧本需要很长时间。你们知道我如何才能完成与for循环相同的任务,但没有for循环本身吗?我知道矢量化可能有助于解决这个问题。我在StackOverflow上找了几个小时的答案,但找不到答案。感谢您的帮助!

您可以使用match函数来解决问题。

variableMatchIndices <- match(df$variable,1:NROW(cheatsheat))

现在,您可以通过以下索引访问cheatsheat来填充df

df$n <- cheatsheat[variableMatchIndices ,1]
df$p <- cheatsheat[variableMatchIndices ,2]

最新更新