使用NA

时间:2018-10-22 19:01:38

标签: r

我有一个包含6列的大型数据框,我想根据条件进行比较并创建一个新的数据框。我正在努力使用mutate和ifelse,因为在某些地方也有NA。我的一小部分数据看起来像这样:

 dput(test)
       structure(list(value = c(1, 0, 0, 0), value_lag_1 = c(0, 1, 0, 
       0), value_lag_2 = c(NA, 0L, 0L, 0L), value_lead_1 = c(0L, 0L, 
       0L, NA), value_lead_2 = c(0L, 0L, 0L, 0L), ref = c(1, 1, 0, 1
       )), .Names = c("value", "value_lag_1", "value_lag_2", "value_lead_1", 
       "value_lead_2", "ref"), row.names = 2:5, class = "data.frame")

我想要做的是将前5列与最后一列(参考)进行比较。 如果前5列中的任何一列为1,而ref为1,则为1,否则为0,所以我的结果(sim)为:

value value_lag_1 value_lag_2 value_lead_1 value_lead_2 ref sim
    1           0          NA            0            0     1   1
    0           1           0            0            0     1   1
    0           0           0            0            0     0   0
    0           0           0           NA            0     1   0

我尝试了以下操作,但没有成功:

 myvar <- names(test)[1:5]
 test%>%
          mutate(sim=ifelse( any(myvar!=0,na.rm=T) & ref==1,1,0))

有任何适用条件的想法吗?任何其他建议都非常欢迎。

非常感谢

4 个答案:

答案 0 :(得分:3)

不需要ifelse,因为可以轻松推断出您的所有条件,其中FALSE为“ 0”,TRUE为“ not 0”:

test$sim <- rowSums(test[1:5], na.rm=TRUE) & test[[6]]
test
#   value value_lag_1 value_lag_2 value_lead_1 value_lead_2 ref   sim
# 2     1           0          NA            0            0   1  TRUE
# 3     0           1           0            0            0   1  TRUE
# 4     0           0           0            0            0   0 FALSE
# 5     0           0           0           NA            0   1 FALSE

或文字0/1:

test$sim <- as.integer( rowSums(test[1:5], na.rm=TRUE) & test[[6]] )
test
#   value value_lag_1 value_lag_2 value_lead_1 value_lead_2 ref sim
# 2     1           0          NA            0            0   1   1
# 3     0           1           0            0            0   1   1
# 4     0           0           0            0            0   0   0
# 5     0           0           0           NA            0   1   0
cc(4)
# (converted)

答案 1 :(得分:1)

...
    <filter-mapping>
        <filter-name>springSecurityFilterChain</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>
...
<filter-mapping>
        <filter-name>domainTrafficDispatcher</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

答案 2 :(得分:0)

test$sim <- rowSums(df[, 1:5], na.rm = T) >= 1 & test$ref == 1

  value value_lag_1 value_lag_2 value_lead_1 value_lead_2 ref   sim
2     1           0          NA            0            0   1  TRUE
3     0           1           0            0            0   1  TRUE
4     0           0           0            0            0   0 FALSE
5     0           0           0           NA            0   1 FALSE

如果您确实需要sim0格式,可以将1转换为数字。

答案 3 :(得分:0)

dplyr开头的内容为基础,尝试

test %>% mutate(sim = ifelse(rowSums(test[1:5], na.rm = TRUE) & ref == 1, 1, 0))

test %>% mutate(sim = ifelse(rowSums(test[1:5], na.rm = TRUE) > 0 & ref == 1, 1, 0))