【问题标题】:refactor data.frame column values重构 data.frame 列值
【发布时间】:2012-08-14 11:02:14
【问题描述】:

对不起,如果这是一个菜鸟问题。 我需要有关如何循环我的数据框的帮助。这是一个示例数据。

a <- c(10:29);
b <- c(40:59);
e <- rep(1,20);
test <- data.frame(a,b,e)

我需要对“a”列中的值使用以下标准来操作“e”列

对于所有的值

"a"

"a" > 15 &

"a" > 20 &

"a" > 25 &

result <- cbind(a,b,rep(1:4, each=5))

我的实际数据框长度超过 100k。如果你能在这里解决我的问题,那就太好了。

【问题讨论】:

  • 我认为标题应该反映这里正在做的事情。您正在尝试根据其他列的值添加重新编码的列。
  • 抱歉 Roman 关于不是最佳标题,你是对的 - 它是关于根据其他人重新编码列。但是你们无论如何都把我解决了:)
  • 只是想帮助下一个对此问题感兴趣的人。通过给它一个信息丰富的标题,你的答案更有可能帮助某人。随意编辑标题以反映您的问题。:)

标签: r dataframe


【解决方案1】:
data.frame(a, b, e=(1:4)[cut(a, c(-Inf, 15, 20, 25, 30))])

更新:

Greg's 注释提供了一种更直接的解决方案,无需通过从cut 返回的因子对整数向量进行子集化。

data.frame(a, b, e=findInterval(a, c(-Inf, 15, 20, 25, 30)))

【讨论】:

  • cut 的非常好的用例。比我的回答好很多。
  • 谢谢!有趣的是,您经常遇到做简单事情的更好方法。如果我们得到更好的东西,我不会感到惊讶。
  • 对不起。刚刚发布了相同的答案!另一种选择:test$e = cut(test$a, breaks = c(0, 15, 20, 25, 30), labels = c(1, 2, 3, 4))
  • 在这种情况下,findInterval 函数可能比 cut 简单一些。
【解决方案2】:

我会为此使用cut()

test$e = cut(test$a, 
             breaks = c(0, 15, 20, 25, 30), 
             labels = c(1, 2, 3, 4))

如果您想“概括”剪辑 - 换句话说,您不知道确切需要制作多少组 5(级别) - 您可以使用 @987654323 采取两步法@和seq()

test$e = cut(test$a, 
             breaks = c(0, seq(from = 15, to = max(test$a)+5, by = 5)))
levels(test$e) = 1:length(levels(test$e))

由于 Backlin 击败了我到 cut() 解决方案,这里有另一个选项(我不喜欢在 这种 的情况下,但发布只是为了演示 R 中可用的许多选项)。

使用car 包中的recode()

require(car)    
test$e = recode(test$a, "0:15 = 1; 15:20 = 2; 20:25 = 3; 25:30 = 4")

【讨论】:

    【解决方案3】:

    您不需要循环。 您几乎拥有所需的一切:

    test[test$a > 15 & test$a < 20, "e"] <- 2
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多