【问题标题】:how to create variable name within a for loop如何在for循环中创建变量名
【发布时间】:2017-08-14 10:59:27
【问题描述】:
x<-as.factor(c("ds","sd","ds","dd"))
fn<-function(x){
results<-list(a=c(2,3,4),b=c("3","d"))
for(i in 1:length(levels(x))){
results<-list(results,
assign(paste("g", i, sep = ""), levels(x)[i]))
  }
return(results)
}
fn(x)
 [[1]]
 [[1]][[1]]
 [[1]][[1]][[1]]
 [[1]][[1]][[1]]$a
 [1] 2 3 4

 [[1]][[1]][[1]]$b
 [1] "3" "d"


 [[1]][[1]][[2]]
 [1] "dd"


 [[1]][[2]]
 [1] "ds"


 [[2]]
 [1] "sd"

上面的输出不是我想要的。我希望它像下面的输出

$a
[1] 2 3 4
$b
"3" "d"
$g1
"dd"
$g2
"ds"
$g3
"sd"

输出中的列表名称不正确。

【问题讨论】:

    标签: r list for-loop


    【解决方案1】:

    我不确定您的问题背后的原因是什么,但这可以在没有任何 for 循环的情况下完成。请尝试

    x <- as.factor(c("ds", "sd", "ds", "dd"))
    results <- list(a = c(2, 3, 4), b = c("3", "d"))
    results <- c(results, setNames(as.list(levels(x)), paste0("g", seq_len(nlevels(x)))))
    
    results
    

    重新创建预期结果:

    $a
    [1] 2 3 4
    
    $b
    [1] "3" "d"
    
    $g1
    [1] "dd"
    
    $g2
    [1] "ds"
    
    $g3
    [1] "sd"
    

    x 的级别被从向量强制转换为列表。然后使用setNames() 重命名列表元素。名称是通过将g 和从1 到x 中的级别数的数字序列粘贴在一起而创建的字符向量。最后,这个新列表被附加到现有的result 列表中。

    【讨论】:

    • 它必须在循环中,因为它是一个函数fn(),并且x对象是未知的。这个因素的水平可以是任何数字。如果 x 的层数为 3,但它可以是 4、5 或 6。则必须使用循环来容纳任意数量的层。
    • 你说得对,我不应该硬编码关卡的数量。请查看我的更新版本,它适用于任意数量的级别 - 仍然没有 for 循环。
    猜你喜欢
    • 2019-10-04
    • 1970-01-01
    • 1970-01-01
    • 2015-09-10
    • 2019-04-29
    • 2018-08-20
    • 2013-06-12
    • 2021-10-09
    • 1970-01-01
    相关资源
    最近更新 更多