【问题标题】:Using for loop over multiple data frames with list of strings在具有字符串列表的多个数据帧上使用 for 循环
【发布时间】:2020-08-24 13:18:34
【问题描述】:

我有四个不同的数据框。它们被命名为“data_QB”、“data_WR”、“data_RB”和“data_TE”。我想在每个变量中获取一个公共变量的四分位数范围(“ppr”),并将这些值分别分配给“iqr_QB”、“iqr_WR”、“iqr_RB”和“iqr_TE”。我想这样做而不必重复四次代码。

我试过了

clist = c("QB", "WR", "RB", "TE")
for (i in clist) {
  assign(paste0("iqr_", i)), IQR(assign(paste0("data_", i)$ppr)))
}

但我收到了错误消息:

Error: $ operator is invalid for atomic vectors

有人知道我该怎么做吗?任何帮助将不胜感激!

【问题讨论】:

  • 把所有的数据框放到一个列表中并循环遍历它。类似lapply(list(your_dataframes), function(i)IQR(i$your_var))

标签: r for-loop


【解决方案1】:

我会建议下一个方法。您在环境中有数据框,因此您可以在循环中使用 sapply() 使用它们的名称,然后使用 eval() 创建新变量。在此示例中,我们将使用 iris 数据集中来自 Species 的所有组作为数据帧来计算 Sepal.LengthIQR。下一个代码:

#Dummy data
data("iris")
#Create example data
List <- split(iris,iris$Species)
names(List) <- paste0('data_',names(List))
list2env(List,envir = .GlobalEnv)

我们定义名称:

#Now set a vector
clist = c("data_setosa", "data_versicolor", "data_virginica")

我们使用eval()bquote() 函数创建循环:

#Loop
for(x in sapply(clist,as.name)) {
  eval(bquote(.(x)[[paste0('iqr_',x)]] <- IQR(.(x)[['Sepal.Length']])))
}

这将在您的所有数据框中生成一个新变量。这里有一个例子(一些行):

data_versicolor

    Sepal.Length Sepal.Width Petal.Length Petal.Width    Species iqr_data_versicolor
51           7.0         3.2          4.7         1.4 versicolor                 0.7
52           6.4         3.2          4.5         1.5 versicolor                 0.7
53           6.9         3.1          4.9         1.5 versicolor                 0.7
54           5.5         2.3          4.0         1.3 versicolor                 0.7
55           6.5         2.8          4.6         1.5 versicolor                 0.7
56           5.7         2.8          4.5         1.3 versicolor                 0.7
57           6.3         3.3          4.7         1.6 versicolor                 0.7
58           4.9         2.4          3.3         1.0 versicolor                 0.7

【讨论】:

    【解决方案2】:

    将@Sotos 的评论扩展为答案:

    1. 使用mget获取列表中的数据
    2. 使用lapply 遍历列表并为ppr 变量计算IQR
    3. 第 2 步的输出是一个列表,根据您的要求为其命名。
    4. 使用list2env 获取全局环境中的向量。
    clist = c("QB", "WR", "RB", "TE")
    new_data <- lapply(mget(paste0('data_', clist)), function(x) IQR(x$ppr))
    names(new_data) <- paste0('iqr_', clist)
    list2env(new_data, .GlobalEnv)
    

    如果您决定将数据保存在列表中并且不从中创建单独的向量,则可以避免第 3 步和第 4 步。列表更易于管理,并且不会在全局环境中填充大量对象。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-02-08
      • 2023-03-19
      • 2022-11-26
      • 2021-09-21
      • 1970-01-01
      • 2021-11-16
      • 2021-08-21
      • 1970-01-01
      相关资源
      最近更新 更多