【问题标题】:changing the cell base on another dataframe in R根据 R 中的另一个数据框更改单元格
【发布时间】:2020-07-19 12:31:06
【问题描述】:

如果 df1==1 中的单元格是当前的 df2 单元格,我想用另一个数据框的值创建一个新列

df1 <- c("1","2","3","4","5")
df2 <- c("a","b","c","d","e")

df <- cbind(df1,df2)
df
     df1 df2
[1,] "1" "a"
[2,] "2" "b"
[3,] "3" "c"
[4,] "4" "d"
[5,] "5" "e"

预期的答案是;

     df1 df2  my.column
[1,] "1" "a"     "a"
[2,] "2" "b"     "2"
[3,] "3" "c"     "3"
[4,] "4" "d"     "4"
[5,] "5" "e"     "5"

提前多谢

【问题讨论】:

    标签: r dplyr tidyr data-manipulation


    【解决方案1】:

    你可以使用ifelse

    transform(df, my_col = ifelse(df1 == 1, df2, df1))
    
    #  df1 df2 my_col
    #1   1   a      a
    #2   2   b      2
    #3   3   c      3
    #4   4   d      4
    #5   5   e      5
    

    等价于dplyr

    library(dplyr)
    df %>%mutate(my_col = ifelse(df1 == 1, df2, df1))
    

    或者先复制df1的值再替换。

    df$my_col <- df$df1
    df$my_col[df$df1 == 1] <- df$df2[df$df1 == 1]
    

    数据

    df <- data.frame(df1,df2, stringsAsFactors = FALSE)
    

    【讨论】:

      【解决方案2】:

      使用data.table 将就地进行分配

      library(data.table)
      setDT(df)[, my_col := df1][df1 == 1, my_col := df2]
      df
      #   df1 df2 my_col
      #1:   1   a      a
      #2:   2   b      2
      #3:   3   c      3
      #4:   4   d      4
      #5:   5   e      5
      

      fifelse

      setDT(df)[, my_col := fifelse(df1 == 1, df2, df1)]
      

      或使用fcase

      setDT(df)[, my_col := fcase(df1 == 1, df2, default = df1)]
      

      数据

      df <- data.frame(df1,df2, stringsAsFactors = FALSE)
      

      【讨论】:

        猜你喜欢
        • 2018-01-16
        • 1970-01-01
        • 2021-09-30
        • 2020-02-26
        • 1970-01-01
        • 1970-01-01
        • 2013-12-27
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多