如何解决根据变量名称为多个变量应用函数parse_number
我想测试是否根据变量名称在数据框的字段中写入数字。
假设以下数据
dat <- data.frame(a_1=c(1,2,1,2),b_2=c(1,c_0=c(1,2))
结果应为新列,以测试变量名称中包含的数字(即a_1,b_2,c_0中的1、2、0)是否包括在数据框的字段中(如果可能)新列,并以1表示(否则为0)。
所以,结果应该像这样。
a_1 b_2 c_0 a_1test b_2test c_0test
1 1 1 1 1 0 0
2 2 2 2 0 1 0
3 1 1 1 1 0 0
4 0 0 0 0 0 1
5 2 2 2 0 1 0
直到我知道自己分别做过
: dat$a_1test <- ifelse(dat$a_1==parse_number("a_1"),0)
dat$b_2test <- ifelse(dat$b_2==parse_number("b_2"),0)
dat$c_0test <- ifelse(dat$c_0==parse_number("c_0"),0)
有没有更简单的解决方案? (这是一个简单的示例,我有100多个行要执行该操作。
解决方法
使用purrr::reduce
可以遍历df的名称以获得所需的结果:
dat <- data.frame(a_1=c(1,2,1,2),b_2=c(1,c_0=c(1,2))
f_help <- function(x,y) {
x[[paste0(y,"test")]] <- ifelse(x[[y]] == readr::parse_number(y),0)
x
}
purrr::reduce(names(dat),f_help,.init = dat)
#> a_1 b_2 c_0 a_1test b_2test c_0test
#> 1 1 1 1 1 0 0
#> 2 2 2 2 0 1 0
#> 3 1 1 1 1 0 0
#> 4 0 0 0 0 0 1
#> 5 2 2 2 0 1 0
,
我们可以使用base R
dat[paste0(names(dat),'test')] <- +(dat == as.integer(sub("\\D+","",names(dat))[col(dat)]))
-输出
dat
# a_1 b_2 c_0 a_1test b_2test c_0test
#1 1 1 1 1 0 0
#2 2 2 2 0 1 0
#3 1 1 1 1 0 0
#4 0 0 0 0 0 1
#5 2 2 2 0 1 0
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。