如何使用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 %>% group_by(fruit) %>% summarise(x = mean(x1))
。我还是不明白你为什么要使用assign()
创建大量变量。以上是关于如何使用R中的for循环将字符串列表转换为数据框名称?的主要内容,如果未能解决你的问题,请参考以下文章