-8

我正在尝试在 R 中编写一个循环,但我认为命名法不正确,因为它不会创建新对象,这是我正在尝试做的一个简化示例:

for i in (1:8) {

List_i <-List
colsToGrab_i <-grep(predefinedRegex_i, colnames(List_i$table))
List_i$table <-  List_i$table[,predefinedRegex_i]
}

我创建了 'predefinedRegex'es 1:8,grep 应该使用它来搜索循环创建一个名为“List_i”的对象,然后找不到“predefinedRegex_i”。

我曾尝试在 i 前面加上 "i" 和 $ 引号,也 [i] 但这些不起作用。

非常感谢任何帮助。谢谢你。

#

在下面使用@RyanGrammel 的答案::

#CREATING regular expressions for grabbing sets groups 1 -7 ::::
g_1 <- "DC*"
g_2 <- "BN_._X.*"
g_3 <- "BN_a*"
g_4 <- "BN_b*"
g_5 <- "BN_a_X.*"
g_6 <- "BN_b_X.*"
g_7 <- "BN_._Y.*"

for i in (1:8) 
{
assign(x = paste("tableA_", i, sep=""), value = BigList$tableA)
assign(x = paste("Forgrep_", i, sep=""), value = colnames(get(x = paste("tableA_", i, sep=""))))
assign(x = paste("grab_", i, sep=""), value = grep((get(x = paste("g_",i, sep=""))), (get(x = paste("Forgrep_",i, sep="")))))
assign(x = paste("tableA_", i, sep=""), value = BigList$tableA[,get(x = paste("grab_",i, sep=""))])
}

对“BigList”中的每个表重复此循环。我发现我无法从 (get(x = paste("BigList_", i, "$tableA" sep="")))) 中提取列名

或 from (get(x = paste("BigList_", i, "[[2]]" sep="")))) 所以更容易先提取表格。我现在将编写一个循环来重新打包列表。

4

1 回答 1

2

问题

您的语法已关闭:您似乎不了解 R 究竟如何处理变量名。

for(i in 1:10) name_i <- 1

上面的代码没有指定name_1、name_2、....、name_10。它一遍又一遍地分配“name_i”

  • 要创建一个列表,你调用 'list()',而不是 List

  • 在循环中创建变量 List_i不会分配 List_1、List_2、...、List_8。

它重复地将一个空列表分配给名称“List_i”。想想看;如果 R 以您尝试的方式命名变量,则同样可能将您的变量命名为 L1st_1、L2st_2 ...有关一些有效的 R 代码,请参见“解决方案”执行类似操作

  • 'predefinedRegex_i' 不会被解释为尝试获取变量 'predefinedRegex_1'、'predefinedRegex_2' 等等。

但是,get(paste0("predefinedRegex_", i)) 就是以这种方式解释的。只要确保在使用它时确实有价值。见下文。

解决方案:

通常,使用它来动态分配变量(List_1、List_2、..)

assign(x = paste0("prefix_", i), value = i)

如果i等于 199,则此代码将值 199 分配给变量 prefix_199。

通常,使用它来动态获取您使用上述代码片段分配的变量。

get(x = paste0("prefix_", i))

如果i等于 199,则此代码获取变量 prefix_199。

那应该可以解决您问题的症结;如果您需要任何进一步的帮助,请随时在此处要求澄清,或通过我的 Twitter 订阅源与我联系。

于 2012-09-04T08:01:04.590 回答