我有一个包含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))
有任何适用条件的想法吗?任何其他建议都非常欢迎。
非常感谢
答案 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
如果您确实需要sim
和0
格式,可以将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))