【问题标题】:Loop for variable definition R循环变量定义 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))
}

【问题讨论】:

    标签: r loops


    【解决方案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),它工作了。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-08
    • 2018-06-30
    • 2015-05-01
    相关资源
    最近更新 更多