我有两个具有相同列结构的资料框(只是为了简化,因为我的 dfs 拥有 40k 个观察值)。
df1 <- data.frame(name = c("mark", "peter", "lily"),
column1= c(1,2,3),
column2 = c(4,5,6))
df2 <- data.frame(name = c("mark", "liam", "peter"),
column1 = c(7,8,9),
column2 = c(1,2,3))
您认为将函式逐行应用于匹配两个资料帧的列但仅应用于匹配的行名的最优雅方法是什么?
在这个例子中:(df1$column1 df1$column2)/df2$column2
应该只应用于两个 dfs 中的相应行“mark”和“peter”。
uj5u.com热心网友回复:
也许像这样......
library(dplyr)
df_combined<-df1%>%
left_join(df2, by="name") %>%
mutate(combined=(column1.x column2.x)/column2.y) %>%
filter(!is.na(combined)) %>%
select(name,combined)
df1 %>% left_join(df_combined)
#> name column1 column2 combined
#> 1 mark 1 4 5.000000
#> 2 peter 2 5 2.333333
#> 3 lily 3 6 NA
df2 %>% left_join(df_combined)
#> name column1 column2 combined
#> 1 mark 7 1 5.000000
#> 2 liam 8 2 NA
#> 3 peter 9 3 2.333333
由reprex 包(v2.0.1)于 2022 年 1 月 2 日创建
uj5u.com热心网友回复:
甲基础R溶液。首先merge
是资料框,然后选择带有grep
.
df_new <- merge(df1, df2, "name")
df_new
name column1.x column2.x column1.y column2.y
1 mark 1 4 7 1
2 peter 2 5 9 3
df_new$calc <- apply(df_new[,-1], 1, function(a)
sum(a[grep("\\.x",names(a))]) / a[grep("2\\.y",names(a))])
df_new
name column1.x column2.x column1.y column2.y calc
1 mark 1 4 7 1 5.000000
2 peter 2 5 9 3 2.333333
0 评论