将多个列中的多个条件组合到新列中

时间:2018-10-14 13:13:10

标签: r if-statement multiple-columns

当我想从多个列中的多个条件创建一个具有单个整数的新列时,我似乎无法使代码正常工作。

我有4个变量:pun1, pun2, pun3, pun4.我想根据条件将这些行转换为新列(pun_severity_out),如果所有条件都成立,则将其设置为1。每当条件不成立时,整数应更改为pun_severity_out = 0

这里的事情是pun1和pun2分组在一起,pun3和pun4也分组。

只要有不适用项,就意味着该人已被他人评价(您不能惩罚自己)。 由于这些Ss已分组,因此我们有一个ingroup和outgroup。因此,如果为pun1 == NA,则表示外包组为pun3pun4。为了清楚起见,如果为pun3 == NA,则外包组为pun1pun2

我要完成的工作是将两个外组成员的所有等于或大于4的值合并为一个值1。但是,只有在另一个组中存在NA时,因为我们特别需要小组成员。

修改:示例数据

   UniqueSS subject group       part round  treatment pun1 pun2 pun3 pun4 severity_pun_out
1        11       1     1 punishment     0 homogenous   NA    0    0    0                0
2        12       2     1 punishment     0 homogenous    0   NA    0    0                0
3        13       3     1 punishment     0 homogenous    0    0   NA    0                0
4        14       4     1 punishment     0 homogenous    0    0    1   NA                0
5        11       1     1 punishment     1 homogenous   NA    0    0    0                0
6        12       2     1 punishment     1 homogenous    0   NA    0    0                0
7        13       3     1 punishment     1 homogenous    0    0   NA    0                0
8        14       4     1 punishment     1 homogenous    0    0    0   NA                0
9        11       1     1 punishment     2 homogenous   NA    0    0    0                0
10       12       2     1 punishment     2 homogenous    0   NA    5    4                1

我最好的尝试是这样做,但是当在同一条语句中使用更多ifelse()时,这会给出NA:

df5$severity_pun_out <- with(df5, ifelse(pun1 == NA & pun3 >= 4 & pun4 >= 4, 1, ifelse(pun2 == NA & pun3 >= 4 & pun4 >= 4, 1, ifelse(pun3 == NA & pun1 >= 4 & pun2 >= 4, 1, ifelse(pun4 == NA & pun1 >= 4 & pun2 >= 4, 1, 0 )))))

1)如果pun1 == NA,则pun3pun4是小组。

2)然后,如果pun3pun4的值等于或大于4,则在该行中为(新)pun_severity_out列放一个1。

我认为NA引起了一些骚动,但这只是需要满足的条件。我不确定如何解决此问题,因为我只是呼吁1而不是对任何NA进行转换。

我应该用特定的NA调用特定的行,然后应用外组转换吗?我假设这就是我使用ifelse()的方法,因为我们专门使用具有特定NA的行。

代码(或函数)最好简短,简单且通用,并且不与数据集交互(除非可能将 pun_severity_out 列)。我可能想将截止值更改为3,因此更改代码不应该只是更改值。

我不经常使用dplyr,但是如果这样/更好/更容易/更快,我会使用它。

其他问题

如果您可以从4个变量中选择组pun(X)并将其整数放入一个名为pun_severity_in的新列中,则奖励积分。与之类似,如果为pun1 == NA,请在pun2列的行中添加pun_severity_in

使用的来源

How can I create a column based on multiple conditions?

How do I create a new column based on multiple conditions from multiple columns?

https://stats.stackexchange.com/questions/115162/filtering-a-dataframe-in-r-based-on-multiple-conditions

预先感谢

1 个答案:

答案 0 :(得分:1)

您不能使用==来测试NA,您只会得到NA。请改用is.na。试试这个:

df5$severity_pun_out <-
  with(df5, ifelse(
    is.na(pun1) &
      pun3 >= 4 &
      pun4 >= 4,
    1,
    ifelse(
      is.na(pun2) &
        pun3 >= 4 &
        pun4 >= 4,
      1,
      ifelse(
        is.na(pun3) &
          pun1 >= 4 &
          pun2 >= 4,
        1,
        ifelse(is.na(pun4) &
                 pun1 >= 4 &
                 pun2 >= 4, 1, 0
        )
      )
    )
  )
)

一种更简单的选择是将成对的is.na条件与|结合起来,像这样:

df5$severity_pun_out <-
  with(df5, ifelse(
    (is.na(pun1) | is.na(pun2)) &
      pun3 >= 4 &
      pun4 >= 4,
    1,
    ifelse((is.na(pun3) | is.na(pun4)) &
             pun1 >= 4 &
             pun2 >= 4,
           1, 0)
  ))

dplyr中,您可以使用case_when,它比ifelse更简单,但这是样式问题。