需要在 R 中的数据帧列表上运行函数

问题描述 投票:0回答:1

我有大约 30 个数据帧,样本数量不同,但元数据列相同。例如,列有

Sample ID
Date of collection
Place of collection
Days since sample collection
等等。

我想根据“采集地点”和“样本采集后的天数”来总结它们。为此,我使用以下函数 -

check_summary_df <- function(x) {
summarized_data <- x %>% group_by(place_of_collection, day) %>% summarize(count = n())
summarized_data$df_name <- deparse(substitute(x)) # adding this as a column so I can track the df_name
return(summarized_data)
}

它为我提供了一个包含所需摘要的数据框。我的 df 名称是非标准的,因此我使用

input_df_list <- c('df1','collected_by_x','collected_by_y')
将它们放入列表中,现在我想在列表上循环该函数。我尝试了一个简单的 for 循环 -

for (i in 1:length(input_df_list)) { check_summary_df(input_df_list[i])}

并出现以下错误-

Error in UseMethod("group_by") : 
  no applicable method for 'group_by' applied to an object of class "character"

从我所看到的,循环的

input_df_list[i]
将输入识别为字符串,而不是将其识别为数据帧。我怎样才能改变这种行为?或者还有其他方法可以循环数据框列表吗?

r loops
1个回答
0
投票

在 R 中执行此操作的惯用方法是创建数据框列表,而不是名称列表,然后对其进行迭代。由于您已经有了

input_df_list
(名称字符向量),因此您可以使用
get()
来完成此操作。这是一个例子:

# Vector of names
input_df_list <- c("iris", "mtcars", "cars")

# Create a list of data frames
df_list <- lapply(input_df_list, \(nm) get(nm)) |>
    setNames(input_df_list)

# Simple function we can apply to all data frames
check_summary_df  <- function(dat) {
    names(dat)
}

# Apply function to each data frame
lapply(df_list, check_summary_df)

# $iris
# [1] "Sepal.Length" "Sepal.Width"  "Petal.Length" "Petal.Width"  "Species"     

# $mtcars
#  [1] "mpg"  "cyl"  "disp" "hp"   "drat" "wt"   "qsec" "vs"   "am"   "gear" "carb"

# $cars
# [1] "speed" "dist" 
© www.soinside.com 2019 - 2024. All rights reserved.