【问题标题】:Create a new column for set of values by multiple conditions通过多个条件为一组值创建一个新列
【发布时间】:2018-04-13 16:07:45
【问题描述】:

假设我有一个数据表:

> a<-data.table(col1=c(7,85,1905,22,250))
   col1
1:    7
2:   85
3: 1905
4:   22
5:  250

考虑到这些条件,我想在同一个数据表中添加一个新列:

if col1(i) <10 then "A"
else if col1(i) <100 then "B"
else if col1(i) <1000 then "C"
else "D"

所以,我会得到

   col1 col2
1:    7    A
2:   85    B
3: 1905    D
4:   22    B
5:  250    C

我尝试了ifelse 方法,但它在所有列中都添加了“A”,doc 表示此方法仅适用于它使用的向量的第一个元素。

dt[, col2 := ifelse(col1 &lt; 10,'A','B')]

我不想使用复杂而长的循环来做到这一点,所以如果有人能在 R 中解释它是如何工作的,我将不胜感激。

问候。

【问题讨论】:

    标签: r for-loop if-statement datatable


    【解决方案1】:

    cut 对你来说是个不错的选择,这样你就可以避免使用嵌套的ifelses

    > a[, col2:=cut(a$col1, 
                    breaks=c(-Inf,10,100,1000,Inf), 
                    include.lowest = TRUE, 
                    labels=c("A", "B", "C", "D"))]
    > a
       col1 col2
    1:    7    A
    2:   85    B
    3: 1905    D
    4:   22    B
    5:  250    C
    

    【讨论】:

    • 知道了。谢谢吉尔伯特
    • 我想知道如何对characters 的向量做同样的事情,所以我想先转换为factor,然后再转换为numeric。例如,如果a,则返回12,如果b3,如果c4,如果还有其他:a[, col2:=as.numeric(cut(as.numeric(as.factor(col1)), breaks=c(-Inf,1,2,3,Inf), include.lowest = TRUE, labels=c(1, 2, 3, 4)))]col1 col21: a 12: b 23: c 34: d 45: e 4。有没有更好的方法来做到这一点?
    猜你喜欢
    • 1970-01-01
    • 2020-04-18
    • 2021-11-23
    • 2015-08-10
    • 1970-01-01
    • 2018-09-28
    • 2012-08-24
    • 2021-03-13
    • 1970-01-01
    相关资源
    最近更新 更多