【问题标题】:Performing binary function to a column in a data frame对数据框中的列执行二进制函数
【发布时间】:2011-01-16 07:36:23
【问题描述】:

假设我有一个包含内容的数据框:

Trial Person 
1     John   
2     John   
3     John   
4     John
1     Bill 
2     Bill
3     Bill
4     Bill

我想把它转换成

Trial Person Day
1     John   1
2     John   1
3     John   2
4     John   2
1     Bill   1
2     Bill   1
3     Bill   2
4     Bill   2

我可以很容易地做到这一点

Trial Person Day
1     John   TRUE
2     John   TRUE
3     John   FALSE
4     John   FALSE
1     Bill   TRUE
2     Bill   TRUE
3     Bill   FALSE
4     Bill   FALSE

通过d$day=d$trial<3,但我怎样才能得到我想要的?

【问题讨论】:

    标签: r dataframe


    【解决方案1】:

    更一般地,如果您尝试将c(1,2,3,4,5,6) 形式的向量转换为c(1,1,2,2,3,3),就像您每天进行两次试验一样,那么您可能希望使用整数除法来表达:

    > x <- 1:6
    > x
    [1] 1 2 3 4 5 6
    > (x-1) %/% 2 + 1
    [1] 1 1 2 2 3 3
    

    【讨论】:

      【解决方案2】:

      获取数据:

      x <- read.table(textConnection(
      "Trial Person 
      1     John   
      2     John   
      3     John   
      4     John
      1     Bill 
      2     Bill
      3     Bill
      4     Bill"), header=TRUE)
      

      我认为您当前的方法是正确的(注意:您不需要 as.numeric,因为在这种情况下进行加法时它会自动转换):

      (x$Trial >= 3) + 1
      

      否则,这是一种使用 plyr 的方法。

      library(plyr)
      ddply(x, .(Person), transform, Day=rep(c(1,2), each=2))
      

      【讨论】:

        【解决方案3】:

        如果您想明确分配(并硬编码 3 的截止值),您可以使用

        d$Day <- ifelse(d$trial<3, 1, 2)
        

        这更透明一点。否则,正如您所发现的,进行算术运算会将逻辑值转换为数字。你可以使用as.numericas.integer自己做:

        as.integer(FALSE)  #0
        as.integer(TRUE)   #1
        

        【讨论】:

        • 太好了,谢谢,这就是我总体上想要做的,但是 if(d$trial
        【解决方案4】:

        好的,所以我找到了解决方案,如果我这样做了

        (d$trial>=3)+1
        

        它将布尔值转换为整数并且它可以工作......但是,有没有更好的方法来做到这一点?

        【讨论】:

        • 这种方法应该比做ifelse要快。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-06-10
        • 1970-01-01
        • 2018-03-31
        • 2018-09-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多