【问题标题】:R: ifelse loop across multiple dataframesR:跨多个数据帧的ifelse循环
【发布时间】:2019-04-23 22:50:19
【问题描述】:

我想创建一个高效的 ifelse 语句,这样如果 df2 中的列与 df1 中的列匹配,则 df2 中的该行以特定方式编码。我的代码有效,但效率很低。

示例数据:

Df1

A        B      C
111     2     1
111     5     2
111     7     3
112     2     4
112     8     5
113     2     6

Df2

A        B
112     2
111     2
113     2
111     5
111     7
112     8

期望的结果:

Df2

A       B       C
112     2     4
111     2     1
113     2     6
111     5     2
111     7     3
112     8     5

我做的是这样的:
Df2$C<- ifelse(Df2$A == 111 & Df2$B == 2, 1, 0)
Df2$C<- ifelse(Df2$A == 111 & Df2$B == 5, 2, 0)
Df2$C<- ifelse(Df2$A == 111 & Df2$B == 7, 3, 0)...

这可行,但有没有办法让 df2 可以引用 df1 中的列并创建列 df2$C,这样就不必手动输入每个组合?

【问题讨论】:

    标签: r loops dataframe if-statement


    【解决方案1】:

    这通常通过连接来完成。来自dplyrleft_join 会将您的第一个表中的每一行与第二个表中的每个匹配行连接起来。

    https://dplyr.tidyverse.org/reference/join.html

    library(dplyr)
    Df2 %>% left_join(Df1)
    
    Joining, by = c("A", "B")
        A B C
    1 112 2 4
    2 111 2 1
    3 113 2 6
    4 111 5 2
    5 111 7 3
    6 112 8 5
    

    来自基本 R 的merge 将给出类似的结果,但如果没有一些额外的争论,它不会保持原始行顺序。

    Merge two data frames while keeping the original row order

    merge(Df2, Df1)
        A B C
    1 111 2 1
    2 111 5 2
    3 111 7 3
    4 112 2 4
    5 112 8 5
    6 113 2 6
    

    【讨论】:

    • Df2
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-03-15
    • 1970-01-01
    • 1970-01-01
    • 2018-12-07
    • 1970-01-01
    • 2021-12-25
    • 1970-01-01
    相关资源
    最近更新 更多