拨开荷叶行,寻梦已然成。仙女莲花里,翩翩白鹭情。
IMG-LOGO
主页 文章列表 Rmapply函式逐行匹配两个资料帧的列

Rmapply函式逐行匹配两个资料帧的列

白鹭 - 2022-03-04 2103 0 0

我有两个具有相同列结构的资料框(只是为了简化,因为我的 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 评论

发表评论

您的电子邮件地址不会被公开。 必填的字段已做标记 *