【问题标题】:Add new column to data frame and populate the row with value from a certain logic将新列添加到数据框并使用来自某个逻辑的值填充该行
【发布时间】:2014-02-27 03:34:21
【问题描述】:

我需要在数据框中添加一列,并根据现有列的某些条件来填充新添加列的值

示例数据框:

 DeptID     Name    Age    Active 
  2        Aira     23      0        
  2        Ben      25      1        
  2        Cat      32      1
  3        Dan      28      1

期望的输出:如果 DeptID = 2 then (如果 Active = 1 then Rate = 0 else Rate = 1) else Rate is empty

DeptID     Name     Age    Active    Rate
  2        Aira     23      0        0    
  2        Ben      25      1        1
  2        Cat      32      1        1
  3        Dan      28      1         

我尝试了下面的代码,但总是得到 0,请帮助。

data = cbind(data, Rate=sapply(data$DeptID, function(x) {
   ifelse(as.character(x) %in% c(2), ifelse(as.character(data$Active) %in% c(1),1,0),0)
 }))

【问题讨论】:

  • 您想要的输出似乎与所述条件不一致。你说如果Active == 1Rate == 0,这不是你想要的输出显示的。我的答案给出了条件建议的输出,而不是提供的输出。修复起来很简单,但我想我会先请你澄清你想要什么。

标签: r dataframe


【解决方案1】:

您在ifelse 的正确轨道上,但您可以在不拆分DeptID 的情况下做到这一点:

dat <- transform(dat, Rate = ifelse(DeptID == 2, ifelse(Active == 1, 0, 1), ""))
dat

> dat
  DeptID Name Age Active Rate
1      2 Aira  23      0    1
2      2  Ben  25      1    0
3      2  Cat  32      1    0
4      3  Dan  28      1     

您还可以通过索引来替换数据框中的元素来执行这些操作(再次从 dat 中的原始数据开始)

dat$Rate <- "" ## add in one of the options as a default value for column
dat$Rate[dat$DeptID == 2 & dat$Active == 1] <- 0
dat$Rate[dat$DeptID == 2 & dat$Active == 0] <- 1

> dat
  DeptID Name Age Active Rate
1      2 Aira  23      0    1
2      2  Ben  25      1    0
3      2  Cat  32      1    0
4      3  Dan  28      1     

【讨论】:

  • 感谢您的回答。
  • 嗨,加文。是否可以这样写: dat$Rate
  • @FraNut 你为什么不试试呢?但是,是的,你错了; R 将无法找到DeptIDActive;您需要在前面加上dat$,如dat$Rate &lt;- ifelse(dat$DeptID == 2, ifelse(dat$Active == 1, 0, 1), "")。这就是我使用transform() 的原因,它允许一个人在不预先设置所有内容的情况下执行此操作。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-07-04
  • 2018-04-20
  • 2021-05-14
  • 1970-01-01
  • 2021-06-26
  • 2021-12-13
  • 1970-01-01
相关资源
最近更新 更多