【问题标题】:in R: replace values in a data frame with indices from a matching vector在 R 中:用匹配向量中的索引替换数据框中的值
【发布时间】:2016-07-11 11:06:28
【问题描述】:

对不起,如果这个标题令人困惑,但我不太清楚如何措辞这个问题,这可能是我似乎无法找到正确功能的原因。

基本上,假设我有这个:

articles <- c(237, 278, 354, 600)
ind <- seq(1, length(articles))
DF <- data.frame(x=c(237, 237, 278, 278, 278, 354, 600, 600, 600),
             y=rnorm(9))

我想用articles 向量中的相应index 替换DF$x 中的所有值。比如,我希望237 变成1278 变成2 等等。

我已经构建了一个 for 循环来执行此操作,但我真正的 data.frame 要大得多,我觉得必须有一种更有效的方法来完成此操作。这是我的 for 循环,以便您可以看到我想要的最终结果:

for (i in 1:length(articles)) {
  DF[DF$x==articles[i], 1] <- ind[i]
}

我查看了replace 函数,但似乎没有这样做。此外,实际上,这是一个 data.table(来自 {data.table} 包),而不是一个 data.frame。如有必要,我显然可以将其转换为 data.frame,但如果在 data.table 包中有更有效的方法来做到这一点,那就太棒了。

非常感谢。 赛斯

【问题讨论】:

  • 如果是data.table,那么DF[, ind := match(x, articles)]或者更复杂的artDT = data.table(x = articles)[, idx := .I]; DF[artDT, idx := i.idx, on="x"]

标签: r for-loop replace dataframe data.table


【解决方案1】:

你可以试试:

DF$x <- as.numeric(as.factor(DF$x))
DF
  x           y
1 1  0.10610802
2 1  1.71933883
3 2  0.01788855
4 2  0.83659415
5 2  0.43162867
6 3  0.68937628
7 4 -1.47557905
8 4 -0.24103146
9 4  0.14286818

【讨论】:

  • 太好了。谢谢!
【解决方案2】:

我愿意:

articles <- c(237, 278, 354, 600)
DF <- data.frame(x=c(237, 237, 278, 278, 278, 354, 600, 600, 600),
         y=rnorm(9))
DF$x <- match(DF$x, articles)

因为在这种情况下 ind 就是你通过 match 得到的值。

【讨论】:

  • 实际上,我将其更改为接受的答案,因为它稍微快一些。不过,这两种选择都运作良好。再次感谢大家!
猜你喜欢
  • 2018-06-16
  • 2018-05-01
  • 1970-01-01
  • 2013-11-06
  • 2020-08-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-04-22
相关资源
最近更新 更多