【问题标题】:Dynamically creating columns of binary values based on a series True/False conditions根据一系列真/假条件动态创建二进制值列
【发布时间】:2016-09-21 05:39:37
【问题描述】:

我希望能够在数据框中创建新列,其值将由预定义的条件语句列表确定。这样做的最终目标是获得一个表二进制值,表示每个实例是否满足条件。它可能看起来像一个笨重或奇怪的输出,但这是我正在尝试建立的经济模型(重复销售模型)的要求。

这是一个非常简化的可重现示例:

df <- data.frame(a=c(1,2,3,4,5),b=c(0.3,0.2,0.5,0.3,0.7)) 
conditions <-   data.frame(y=df$b>=0.5, z=df$b>=0.7) 
columns <- c("y","z") 
for(i in length(columns)){ 
   df[, paste("var_",columns[i],sep="")] <- ifelse(conditions[i],1,0) 
} 

因此,在这种情况下,我想获取列“var_y”和“var_z”,它们的二进制值表示是否满足条件 y 或 z 的条件。

现在,我收到此错误:

ifelse(conditions[i], 1, 0) 中的错误:(list) 对象不能 强制输入“逻辑”

我不明白,因为数据框“条件”中的所有信息都是“逻辑”类型。

【问题讨论】:

    标签: r loops if-statement


    【解决方案1】:

    我们可以这样做

    df[paste0("var_", seq_along(columns))] <- +(conditions)
    df
    #  a   b var_1 var_2
    #1 1 0.3     0     0
    #2 2 0.2     0     0
    #3 3 0.5     1     0
    #4 4 0.3     0     0
    #5 5 0.7     1     1
    

    【讨论】:

    • 谢谢!仅供我自己参考,这行的“+( ... )”部分叫什么?该函数有名称吗?
    • @Geoprorammer 只是将逻辑数据集强制为二进制。一个规范的方法是df[paste0("var_", seq_along(columns))] &lt;- lapply(conditions, as.integer)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-09-04
    • 1970-01-01
    • 1970-01-01
    • 2019-07-18
    • 2020-07-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多