r-根据变量名称为多个变量应用函数parse_number



我想根据变量的名称来测试数据帧的字段中是否写入了数字。

假设以下数据

dat <- data.frame(a_1=c(1,2,1,0,2), b_2=c(1,2,1,0,2), c_0=c(1,2,1,0,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"), 1, 0)
dat$b_2test <- ifelse(dat$b_2==parse_number("b_2"), 1, 0)
dat$c_0test <- ifelse(dat$c_0==parse_number("c_0"), 1, 0)

有没有更简单的解决方案?(这是一个简单的例子,我有100多行要做这个操作。

使用purrr::reduce,您可以循环使用df的名称以获得所需的结果:

dat <- data.frame(a_1=c(1,2,1,0,2), b_2=c(1,2,1,0,2), c_0=c(1,2,1,0,2))
f_help <- function(x, y) { 
x[[paste0(y, "test")]] <- ifelse(x[[y]] == readr::parse_number(y), 1, 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

最新更新