如何使用R中的for循环将字符串列表转换为数据框名称?

Posted

技术标签:

【中文标题】如何使用R中的for循环将字符串列表转换为数据框名称?【英文标题】:How to turn a list of strings into data frame names with for loop in R? 【发布时间】:2022-01-21 20:19:46 【问题描述】:

我希望对 R 中的这个问题有一些建议。我有一个数据框“my_fruits_data”,其中包含许多列,包括 name_cols 中的索引列。我想用 for 循环一一过滤这些索引列,并将过滤后的记录存储在各自的数据框中,它们的名称列在 df_fruits 中以进行后处理。显然,它不起作用,因为 df_fruits 元素是字符串而不是实际的数据框名称。我已经搜索并得到了一些提示,但实际上都没有帮助。

# column names
name_cols <- c("Index_apple",  
             "Index_pear",
             "Index_orange",  
             "Index_watermelon",
             "Index_strawberry"
         )
# dataframe names for filtered result 
df_fruits <- c("df_apple",  
             "df_pear",
             "df_orange",  
             "df_watermelon",
             "df_strawberry")

for (i in name_cols) 
  
    df_fruits[i] <- my_fruits_data %>% 
           filter (.data[[name_cols[i]]] ==1) 
    ......

谢谢 追逐77

【问题讨论】:

它有助于为问题提供可用数据,使其成为一个完整的“最小工作示例”;请包括我们可以使用的样本数据(reprex),最好是dput(x);请参阅***.com/q/5963269、minimal reproducible example 和 ***.com/tags/r/info。最终,我觉得for 循环不太可能是首选的方法,你能在所有这些处理结束时展示你打算拥有什么吗? R 可能有一种更有效的方式来满足您的需求。 这只是简单的数据拆分/数据分组。您不需要使用 for 循环。举例说明您的数据和预期输出。另外,进一步处理是什么意思?如果您要对每个水果数据集进行几乎相似的后期处理,您应该将整个数据集分组而不是将其放在不同的水果数据集中。 【参考方案1】:

我了解到您希望根据水果类型拆分数据,该类型由单独的索引列提供。这是使用示例数据集执行此操作的方法。

library(tidyverse)
my_fruits_data = tribble(
  ~ index_apple, ~ index_pear, ~index_banana, ~ x1,
  1, 0, 0, 10,
  1, 0, 0, 11,
  0, 1, 0, 12,
  0, 0, 1, 13,
  0, 0, 1, 14, 
  0, 0, 1, 15
)

示例数据:

> my_fruits_data
# A tibble: 6 x 4
  index_apple index_pear index_banana    x1
        <dbl>      <dbl>        <dbl> <dbl>
1           1          0            0    10
2           1          0            0    11
3           0          1            0    12
4           0          0            1    13
5           0          0            1    14
6           0          0            1    15

首先,您可以将数据转换为有一个提到水果类型的 fruit 列:

fruit_data = my_fruits_data %>% 
  pivot_longer(
    cols = starts_with("index_"), 
    names_prefix = "index_", 
    names_to = "fruit",
    values_to = "fruit_ind"
  ) %>% 
  filter(fruit_ind == 1) %>% 
  select(-fruit_ind)

结果:

> fruit_data
# A tibble: 6 x 2
     x1 fruit 
  <dbl> <chr> 
1    10 apple 
2    11 apple 
3    12 pear  
4    13 banana
5    14 banana
6    15 banana

最后,正如@Onyambu 提到的,您可以考虑按我们的新变量fruit 对这些数据进行分组。如果你想对不同的水果做不同的处理,你可以split()数据来​​获取每个水果的单独数据框列表:

> split(fruit_data, fruit_data$fruit)
$apple
# A tibble: 2 x 2
     x1 fruit
  <dbl> <chr>
1    10 apple
2    11 apple

$banana
# A tibble: 3 x 2
     x1 fruit 
  <dbl> <chr> 
1    13 banana
2    14 banana
3    15 banana

$pear
# A tibble: 1 x 2
     x1 fruit
  <dbl> <chr>
1    12 pear 

【讨论】:

非常感谢 Kybazzi 提供了解决问题的详细演示,也感谢 Onyambu 和 r2evens 的想法。我会尝试 - 它应该工作。但是这个问题促使我寻找一种将字符串转换为数据框名称的方法,只知道使用函数assign(): 非常感谢 Kybazzi 提供了解决问题的详细演示,也感谢 Onyambu 和 r2evens 的想法。我会尝试 - 它应该工作。但是这个问题促使我寻找一种将字符串转换为数据框名称的方法,并且只知道使用函数 assign():assign(string, df_apple %>% filter(.data[[Index_fruits[1]] ] ==1))。但是这种方法不适用于我的情况。希望有一些通用的想法来将字符串分配给数据框名称。 我不认为以这种方式尝试使用 assign() 是一种推荐的方法 - 为什么要这样做而不是类似于我在这里展示的解决方案? 因为有以下分析例如使用总结()。我不想为不同的水果多次复制同一组代码(在我的实际案例中超过 50 种)。这就是我尝试使用循环的原因。 在我的代码中,可以在fruit_data上汇总结果,比如fruit_data %&gt;% group_by(fruit) %&gt;% summarise(x = mean(x1))。我还是不明白你为什么要使用assign()创建大量变量。

以上是关于如何使用R中的for循环将字符串列表转换为数据框名称?的主要内容,如果未能解决你的问题,请参考以下文章

使用for循环遍历python中的列表

在R中将嵌套的for循环转换为并行

基础知识 各类数据类型方法

如何将for循环输出转换为列表?

如何将此列表理解转换为 for 循环,但我不能 [重复]

在 R 中使用混合类型将嵌套列表中的字符数字转换为数字