r - 在 R 中,在不同数据框中具有相同名称的列之间分别应用一个函数
问题描述
我有两个数据框:
require(tidyverse)
set.seed(42)
df1 = data_frame(x = c(4,3), y = c(0, 0), z = c(NA, 3))
df2 = data_frame(x = sample(1:4, 100, replace = T), y = sample(c(-3, 0, 3), 100, replace = T), z = c(NA, NA, rep(3, 98))) %>% mutate(Tracking = row_number())
我想分别为 的每一行df1
AND 的每一列df1
找到等于的索引df2
。如果我尝试循环,那么每次迭代将如下所示:df2
df1
for (i in 1: nrow(df1)){
for (j in 1: ncol(df1)) {
L[[i]][j] = inner_join(df1[i,j], df2)
}
}
例如,列表的第一个元素是:
inner_join(df1[1,1], df2)
Joining, by = "x"
# A tibble: 26 x 4
x y z Tracking
<dbl> <dbl> <dbl> <int>
1 4. 0. NA 1
2 4. -3. NA 2
3 4. 0. 3. 4
4 4. 3. 3. 13
5 4. 0. 3. 16
6 4. -3. 3. 17
7 4. 0. 3. 21
8 4. 0. 3. 23
9 4. 0. 3. 24
10 4. 3. 3. 28
# ... with 16 more rows
但是我相信有一种更有效的方法可以做到这一点。可能dplyr
+ purrr
? 我没有太多经验purrr
,但我觉得这个map
功能可以派上用场。我只是不知道如何分别调用这些列。
解决方案
你可以做类似的事情
L <- map(names(df1),
function(.) {
out <- inner_join(x = df1[, ., drop = FALSE],
y = df2,
by = .)
split(out, out[[.]])
})
但我不确定这是否比您开始使用的 for 循环更好或更有效。
推荐阅读
- nearprotocol - NFT 有价转账
- r - 如何删除R中的列?
- android - 如果可以的话,使用更具体的更改事件总是更有效。依靠 notifyDataSetChanged 作为最后的手段。回收视图
- swift - 如何在 Swift 中对 Int 类型的字符串格式的数组进行排序
- reactjs - axios post请求中的setState挂钩不起作用
- c++ - cin.ignore() 如果有字符
- assembly - 创建一个“显示” ax 中的位的循环。“显示”一词意味着将这些位放入另一个寄存器。另一个寄存器中的值为 0 或 1
- flutter - Flutter Error: "cm", The argument type ,ContextModel can't be assigned to the parameter type 'ContextModel
- r - 按条件从数据框中的值中减去
- python - 调整无边框窗口大小