[英]R dplyr mutate multiple columns using custom function to create new column
[英]R: mutate over multiple columns to create a new column
我正在尝试根据其他列的值创建一个新列。
这是一个与我正在处理的数据集相似的数据集。 我有三个变量,Test1,Test2,Test3。 我试图创建一个新变量,如果任何测试变量是DF60,DF61,DF63或DF64,则为1,否则为0。
Test1<-c("DF64", "DF63", "DF89", "DF30", "DF70")
Test2<-c("DF61", "DF25", "DF00", "DF30", "DF99")
Test3<-c("DF80", "DF63", "DF60", "DF63", "DF70")
Test<-data.frame(Test1, Test2, Test3)
目前,我有许多ifelse语句,并且正在寻找一个可以在多个Test变量上循环的同时允许查找多个值的代码。
在浏览了一些类似的线程之后,我尝试了mutate_at,但是我认为这不是正确的方法。
Test2<- Test %>%
mutate_at(vars(starts_with("Test")), funs(Test=ifelse("DF60" | "DF61" |
"DF62" | "DF63", 1, 0)))
任何帮助深表感谢!
谢谢!
Test2<- Test %>%
dplyr::select(starts_with("Test"))%>%
mutate_all(function(x){x %in% c("DF60","DF61","DF62","DF63")})%>%
mutate(out = ifelse(rowSums(.)<1,0,1))
评论后的调整
如果要保留其他列,则yutannihilation提议的mutate_at会更好。 然后,问题就变成了在选择列时对rowums进行突变。 不知道下一件事是否是最佳实践,但它能奏效(对我的上一个问题的答案进行了重新设计: dplyr对列子集进行mutate(所有这些列上的一个函数组合) )
library(tidyverse)
library(anomalyDetection)
Test1<-c("DF64", "DF63", "DF89", "DF30", "DF70")
Test2<-c("DF61", "DF25", "DF00", "DF30", "DF99")
Test3<-c("DF80", "DF63", "DF60", "DF63", "DF70")
Test<-data.frame(Test1, Test2, Test3)
Test$ExtraCol<-LETTERS[1:5]
Test2<- Test %>%
mutate_at(vars(starts_with("Test")),funs(bin=.%in% c("DF60","DF61","DF62","DF63")))%>%
split(.,1<10)%>%
map_df(~mutate(.,out=rowSums(.[paste0("Test",1:3,"_bin")])>0))
Test1 Test2 Test3 ExtraCol Test1_bin Test2_bin Test3_bin out
DF64 DF61 DF80 A FALSE TRUE FALSE TRUE
DF63 DF25 DF63 B TRUE FALSE TRUE TRUE
DF89 DF00 DF60 C FALSE FALSE TRUE TRUE
DF30 DF30 DF63 D FALSE FALSE TRUE TRUE
DF70 DF99 DF70 E FALSE FALSE FALSE FALSE
尽管Dries的答案足够好,但让我添加一些有关funs()
解释。
funs()
后缀和表达式对。 例如,如果指定suffix1
和suffix2
,则将获得名为Test1_suffix1
, Test1_suffix2
, Test2_suffix1
, Test2_suffix2
新列,依此类推:
funs(suffix1 = ..., suffix2 = ...)
其次,您需要.
代表列向量。 因此, ifelse(...)
的正确版本应为:
Test %>%
mutate_at(vars(starts_with("Test")),
funs(bin = ifelse(. == "DF60" | . == "DF61" | . == "DF62" | . == "DF63", 1, 0)))
#> Test1 Test2 Test3 Test1_bin Test2_bin Test3_bin
#> 1 DF64 DF61 DF80 0 1 0
#> 2 DF63 DF25 DF63 1 0 1
#> 3 DF89 DF00 DF60 0 0 1
#> 4 DF30 DF30 DF63 0 0 1
#> 5 DF70 DF99 DF70 0 0 0
显然, %in%
优于|
顺序 。
Test %>%
mutate_at(vars(starts_with("Test")),
funs(bin = ifelse(. %in% c("DF60", "DF61", "DF62", "DF63"), 1, 0)))
#> Test1 Test2 Test3 Test1_bin Test2_bin Test3_bin
#> 1 DF64 DF61 DF80 0 1 0
#> 2 DF63 DF25 DF63 1 0 1
#> 3 DF89 DF00 DF60 0 0 1
#> 4 DF30 DF30 DF63 0 0 1
#> 5 DF70 DF99 DF70 0 0 0
如果只想过滤,则可以使用filter_at()
。
Test %>%
filter_at(vars(starts_with("Test")),
any_vars(. %in% c("DF60", "DF61", "DF62", "DF63")))
#> Test1 Test2 Test3
#> 1 DF64 DF61 DF80
#> 2 DF63 DF25 DF63
#> 3 DF89 DF00 DF60
#> 4 DF30 DF30 DF63
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.