当我想从多个列中的多个条件创建一个具有单个整数的新列时,我似乎无法使代码正常工作。
我有4个变量:pun1, pun2, pun3, pun4.
我想根据条件将这些行转换为新列(pun_severity_out
),如果所有条件都成立,则将其设置为1。每当条件不成立时,整数应更改为pun_severity_out = 0
这里的事情是pun1和pun2分组在一起,pun3和pun4也分组。
只要有不适用项,就意味着该人已被他人评价(您不能惩罚自己)。
由于这些Ss已分组,因此我们有一个ingroup和outgroup。因此,如果为pun1 == NA
,则表示外包组为pun3
和pun4
。为了清楚起见,如果为pun3 == NA
,则外包组为pun1
和pun2
。
我要完成的工作是将两个外组成员的所有等于或大于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
,则pun3
和pun4
是小组。
2)然后,如果pun3
和pun4
的值等于或大于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?
预先感谢
答案 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
更简单,但这是样式问题。