【问题标题】:how to assign distinct values to distinct rows in a new column?如何为新列中的不同行分配不同的值?
【发布时间】:2021-04-27 04:16:52
【问题描述】:

我正在尝试将值的原子向量分配给由 df 行组成的原子向量:

library(dplyr)

df %>% 
  mutate(new_col= assign(c('A1', 'A2', 'A3', 'A4', 'A5'), c(10,25,35,45,50)))

但是这段代码会输出下一个错误:

错误:mutate() 输入 new_col 有问题。 x 输入 new_col 无法回收到大小 8。 i 输入new_colassign(c("A1", "A2", "A3", "A4", "A5"), c(10, 25, 35, 45, 50))。 i 输入 new_col 的大小必须为 8 或 1,而不是 5。 运行rlang::last_error() 以查看错误发生的位置。 Además:警告信息: 1:mutate() 输入 new_col 有问题。 i sólo el prime elemento es usado como nombre de variable i 输入new_colassign(c("A1", "A2", "A3", "A4", "A5"), c(10, 25, 35, 45, 50))。 2:在分配(c(“A1”,“A2”,“A3”,“A4”,“A5”),c(10,25,35,45,50)): sólo el prime elemento es usado como nombre de variable

预期的输出可能如下所示:

# A1 10
# A1 10
# A2 25
# A3 35
# A4 45
# A4 45
# A5 50
# A5 50

数据

df <- data.frame(legend=c('A1','A1' ,'A2', 'A3', 'A4', 'A4', 'A5', 'A5'))

如何调整管道?

【问题讨论】:

  • 创建一个索引到原始df行的新列
  • 如果您需要创建列,那么最好有一个命名向量或带有键/值数据的小标题并加入keydat &lt;- tibble(legend = c('A1', 'A2', 'A3', 'A4', 'A5'), value = c(10, 25, 35, 45, 50)); &gt; left_join(df, keydat)
  • df$new &lt;- c(10, 25, 35, 45, 50)[match(df$legend, c('A1', 'A2', 'A3', 'A4', 'A5'))]

标签: r dplyr


【解决方案1】:

我认为assign 不是您要找的。您可以使用recode 来执行此操作,它也来自dplyr

library(dplyr)
df %>% 
  mutate(new_col = recode(legend, A1 = 10, A2 = 25, A3 = 35, A4 = 45, A5 = 50))

或者使用命名向量:

v <- c("A1" = 10, "A2" = 25, "A3" = 35, "A4" = 45, "A5" = 50)

df %>% 
  mutate(new_col = recode(legend, !!!v))

# OR

df %>% 
  mutate(new_col = v[legend])

# In base R

df$new_col <- v[df$legend]

# OR

within(df, new_col <- v[legend])

输出

  legend new_col
1     A1      10
2     A1      10
3     A2      25
4     A3      35
5     A4      45
6     A4      45
7     A5      50
8     A5      50

assign用于给指定环境中的值赋值:

a <- 1
assign("a", 1)

【讨论】:

    【解决方案2】:

    使用data.table,您可以使用merge

    library(data.table)
    df <- data.frame(legend=c('A1','A1' ,'A2', 'A3', 'A4', 'A4', 'A5', 'A5'))
    setDT(df)
    df2  <- data.table(legend = paste0("A", 1:5), value = c(10,25,35,45,50))
    
    merge(df,df2, by = "legend")
    
      legend value
    1     A1    10
    2     A1    10
    3     A2    25
    4     A3    35
    5     A4    45
    6     A4    45
    7     A5    50
    8     A5    50
    

    类似的结果可以使用

    df2[df, on = "legend"] #As in you_lookup_datable[table, on ="key_column"]
    

    【讨论】:

      猜你喜欢
      • 2011-08-20
      • 2015-12-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-02-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多