【问题标题】:How to match and replace value from one dataframe to another?如何将一个数据帧中的值匹配和替换到另一个数据帧?
【发布时间】:2021-03-21 11:18:09
【问题描述】:

我有一个数据框df

df = data.frame("A" = c("car",NA,"cat","cut"),
                "B" = c(NA,"car",NA,"cat"),
                "C" = c("cut","cat",NA,NA))

还有一个df2

df2 = data.frame("Group" = c("car", "cat","cut"),
                 "Value" = c(1,2,3))

我想要这样的输出

     A    B    C
1    1   NA    3
2   NA    1    2
3    2   NA   NA
4    3    2   NA

我对 R 比较陌生,所以我需要一些帮助来解决这个问题。谢谢!

【问题讨论】:

标签: r dataframe replace match


【解决方案1】:

您可以unlist 数据框并使用match

df[] <- df2$Value[match(unlist(df), df2$Group)]
df

#   A  B  C
#1  1 NA  3
#2 NA  1  2
#3  2 NA NA
#4  3  2 NA

要使用dplyr 解决此问题,您可以这样做:

library(dplyr)
df %>% mutate(across(.fns = ~df2$Value[match(., df2$Group)]))

【讨论】:

    【解决方案2】:

    你可以使用factor:

    df_new <- df # just in case you want to retain your original df
    df_new[] <- lapply(df, factor, levels = df2$Group, labels = df2$Value)
    df_new 
    #      A    B    C
    # 1    1 <NA>    3
    # 2 <NA>    1    2
    # 3    2 <NA> <NA>
    # 4    3    2 <NA>
    

    但请注意,这些值是字符。要获取数值,您可以使用lapply(df, function(x) as.integer(as.character(factor(x, levels = df2$Group, labels = df2$Value))))

    或者,您可以这样做:

    df_new[] <- factor(as.matrix(df), levels = df2$Group, labels = df2$Value)
    

    这将再次返回带有字符列的data.frame。使用as.integer(as.character(factor(as.matrix(df), levels = df2$Group, labels = df2$Value)))获取数值。


    如果您的值列始终只是一个连续整数,您可以在使用as.integer 之前跳过“标签”参数和as.character。此外,您可以使用data.matrix 来简化数值的提取。


    这些已经过基准测试in this Gist

    【讨论】:

      猜你喜欢
      • 2021-08-02
      • 1970-01-01
      • 2021-05-12
      • 2023-03-25
      • 1970-01-01
      • 2016-07-24
      • 1970-01-01
      • 2021-05-22
      相关资源
      最近更新 更多