【问题标题】:Column values based on different column [duplicate]基于不同列的列值[重复]
【发布时间】:2021-03-24 05:42:41
【问题描述】:

我正在研究 R 并且我有以下数据框 data:

country index value
A 0 15
B 1 15
C 2 15
D 3 15
E 4 15
F 5 15

我如何映射值,以便获得包含特定信息的额外列 EXTRA。例如,我想传递信息(以任何形式),索引为 0,1 和 2 的国家/地区应在 EXTRA 中具有值 first,3 和 5 应具有 second 和 4,例如 eleventh。所以预期的输出应该是这样的:

country index value EXTRA
A 0 15 first
B 1 15 first
C 2 15 first
D 3 15 second
E 4 15 eleventh
F 5 15 second

【问题讨论】:

标签: r


【解决方案1】:

我们可以使用命名向量来匹配和替换

nm1 <- setNames(c('first', 'first', 'first', 'second', 'eleventh', 'second'), 0:5)
df1$EXTRA <- nm1[as.character(df1$index)]

或者可以使用连接

library(data.table)
keydat <- data.frame(index = 0:5,
    EXTRA = c('first', 'first', 'first', 'second', 'eleventh', 'second'))
setDT(df1)[keydat, EXTRA := EXTRA, on = .(index)]

数据

df1 <- structure(list(country = c("A", "B", "C", "D", "E", "F"), index = 0:5, 
    value = c(15L, 15L, 15L, 15L, 15L, 15L)), class = "data.frame",
    row.names = c(NA, 
-6L))

【讨论】:

  • 如果data.frame 有大量的值,还有其他方法吗?
  • @CroatiaHR 这会非常快。其他选项是 mergejoin 可能有点慢
【解决方案2】:

这是一个使用嵌套ifelse的选项

transform(
  df,
  EXTRA = ifelse(index %in% 0:2,
    "first",
    ifelse(index %in% c(3, 5),
      "second",
      "eleventh"
    )
  )
)

merge + stack

merge(df,
  setNames(
    stack(list(first = 0:2, second = c(3, 5), eleventh = 4)),
    c("index", "EXTRA")
  ),
  by = "index",
  all.x = TRUE
)

给了

  country index value    EXTRA
1       A     0    15    first
2       B     1    15    first
3       C     2    15    first
4       D     3    15   second
5       E     4    15 eleventh
6       F     5    15   second

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-01-20
    • 2018-05-08
    • 1970-01-01
    • 2021-12-14
    • 2020-10-17
    • 2015-09-01
    • 2016-04-26
    • 2019-10-09
    相关资源
    最近更新 更多