根据变量名称为多个变量应用函数 parse_number
Apply function parse_number for multiple variables depending on variable name
我想根据变量名测试一个数字是否写入数据框的字段。
假设以下数据
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
我想根据变量名测试一个数字是否写入数据框的字段。
假设以下数据
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