循环变量定义 R
Posted
技术标签:
【中文标题】循环变量定义 R【英文标题】:Loop for variable definition R 【发布时间】:2022-01-12 21:56:54 【问题描述】:我有一个数据框,我想定义多个列,这些列具有在变量的原始版本(列)上操作的相同函数(ntile
)。我不确定循环或其他东西是否会起作用,但下面的示例是一个玩具示例。我的实际数据框有超过 20 个变量需要处理。
基本上,我想为我的数据框中的每个数字变量创建一个名为“original_name”_bin 的变量。这些 _bin 变量只是在原始非 _bin 版本上操作的ntile
函数:
dat1 <- read.table(text = "x1 x2
10 20
20 30.5
30 40.5
40 20.12
50 25
70 86
80 75
90 45 ", header = TRUE)
num_names <- paste(colnames(dat1[sapply(dat1, is.numeric)]))
bin_names <- paste(colnames(dat1[sapply(dat1, is.numeric)]), "bin", sep = "_")
# Want to make columns in data frame where the var_bin is:
dat1$x1_bin <- ntile(dat1$x1, n = 10)
# loop
for (i in 1:length(bin_names))
assign(paste0("dat1$", bin_names[i]), ntile(???, 10))
【问题讨论】:
【参考方案1】:这是使用lapply
的一种基本方法:
dat1 <- read.table(text = "x1 x2
10 20
20 30.5
30 40.5
40 20.12
50 25
70 86
80 75
90 45 ", header = TRUE)
num_names <- paste(colnames(dat1[sapply(dat1, is.numeric)]))
bin_names <- paste(colnames(dat1[sapply(dat1, is.numeric)]), "bin", sep = "_")
dat1[bin_names] <- lapply(dat1[num_names], \(x) dplyr::ntile(x, n = 10))
dat1
#> x1 x2 x1_bin x2_bin
#> 1 10 20.00 1 1
#> 2 20 30.50 2 4
#> 3 30 40.50 3 5
#> 4 40 20.12 4 2
#> 5 50 25.00 5 3
#> 6 70 86.00 6 8
#> 7 80 75.00 7 7
#> 8 90 45.00 8 6
由reprex package 创建于 2021-12-07 (v2.0.1)
作为基础 R 循环:
for (i in 1:length(bin_names))
dat1[bin_names[i]] <- dplyr::ntile(dat1[num_names[i]], 10)
dat1
#> x1 x2 x1_bin x2_bin
#> 1 10 20.00 1 1
#> 2 20 30.50 2 4
#> 3 30 40.50 3 5
#> 4 40 20.12 4 2
#> 5 50 25.00 5 3
#> 6 70 86.00 6 8
#> 7 80 75.00 7 7
#> 8 90 45.00 8 6
dplyr::across
:
library(dplyr)
dat1 %>%
mutate(across(all_of(num_names),
~ ntile(.x, n = 10),
.names = ".col_bin"))
#> x1 x2 x1_bin x2_bin
#> 1 10 20.00 1 1
#> 2 20 30.50 2 4
#> 3 30 40.50 3 5
#> 4 40 20.12 4 2
#> 5 50 25.00 5 3
#> 6 70 86.00 6 8
#> 7 80 75.00 7 7
#> 8 90 45.00 8 6
由reprex package (v2.0.1) 于 2021-12-07 创建
【讨论】:
我不认识\(x)
语法。我把它换成了function(x)
,它工作了。谢谢!以上是关于循环变量定义 R的主要内容,如果未能解决你的问题,请参考以下文章