【问题标题】:R How can I replace values with values of another dataframe?R 如何用另一个数据框的值替换值?
【发布时间】:2017-07-17 01:00:11
【问题描述】:

我有一个巨大的数据框 df,其中包含“a”列中的数字我还有一个数据框 name,其中包含与这些数字对应的名称。

df:                          
 a   b     c                   name:
 1   val1  val2                  1  cat
 1   val1  val2                  2  dog
 2   val1  val2                  3  rabbit
 3   val1  val2
 3   val1  val2
 3   val1  val2

现在我想用名称替换数字。新的 dataFrame 应该如下所示:

df:                                      
   a        b     c      
   cat      val1  val2                  
   cat      val1  val2                  
   dog      val1  val2                  
   rabbit   val1  val2
   rabbit   val1  val2
   rabbit   val1  val2

我就是这样意识到的。它有效,但我不满意,因为我对名字进行了硬编码......

  df$a<-replace(df$a, df$a==1, "cat" )
  df$a<-replace(df$a, df$a==2, "dog" )
  df$a<-replace(df$a, df$a==3, "rabbit" )

如何从我的数据框名称中获取新值?

谢谢!

【问题讨论】:

  • 只是一个提示:您可以查看一些连接函数。例如在dplyr 或 ``data.table` 中。
  • df$a
  • 非常感谢您的帮助:-)

标签: r dataframe replace


【解决方案1】:

数据:

df = data.frame(a = c(1,1,2,3,3,3), b = rep('val1', 6), c = rep('val2', 6))

用字符替换值:

df$a = c('cat', 'dog', 'rabbit')[ match(df$a, sort(unique(df$a))) ]

输出

df
#       a    b    c
#1    cat val1 val2
#2    cat val1 val2
#3    dog val1 val2
#4 rabbit val1 val2
#5 rabbit val1 val2
#6 rabbit val1 val2

【讨论】:

  • 这个解决方案隐含地假设 'cat' 将被 df$a 的最小(一次排序)值替换。是否可以有对,例如,c(1, 'cat') 表示要用什么值替换什么值?
  • 在这种情况下,您必须按照@manotheshark 的解决方案中所做的那样按索引合并数据如果您的数据集很大,则将 data.frame 替换为 data.table 然后执行合并
【解决方案2】:

这是合并两个 data.frames。这不需要硬编码任何值,只需向 data.frames 添加新值

df <- data.frame(a = c(1,1,2,3,3,3), b = "val1", c = "val2")
df.name <- data.frame(a = 1:3, name=c("cat", "dog", "rabbit"))

df1 <- merge(df, df.name, by = "a")  # merge two data.frames by `a`

如果您希望将名称存储在a 列中,则需要进行一些清理

df1$a <- df1$name
df1$name <- NULL

       a    b    c
1    cat val1 val2
2    cat val1 val2
3    dog val1 val2
4 rabbit val1 val2
5 rabbit val1 val2
6 rabbit val1 val2

【讨论】:

    【解决方案3】:

    样本数据:

    df = data.frame(a = c(1,1,2,3,3,3), b = rep('val1', 6), c = rep('val2', 6))
    df
    
    #   a    b    c
    # 1 1 val1 val2
    # 2 1 val1 val2
    # 3 2 val1 val2
    # 4 3 val1 val2
    # 5 3 val1 val2
    # 6 3 val1 val2
    

    使用dplyrrecode(),可以实现:

    df %>% mutate(a = recode(a, '1' = 'cat', '2' = 'dog', '3' = 'rabbit'))
    
    #        a    b    c
    # 1    cat val1 val2
    # 2    cat val1 val2
    # 3    dog val1 val2
    # 4 rabbit val1 val2
    # 5 rabbit val1 val2
    # 6 rabbit val1 val2
    

    【讨论】:

    • 这个解决方案的难点在于替换必须手动输入 '1' = 'cat' 等等。是否有可能有两个列表,一个指示要替换的内容,第二个表示要替换成什么?
    猜你喜欢
    • 2016-08-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-23
    • 1970-01-01
    • 2022-10-05
    • 2020-10-17
    • 2019-12-27
    相关资源
    最近更新 更多