我正在嘗試為一個大串列中的所有元素/資料框創建 2 個新變數,類似于在這篇文章如何在 R 中為具有資料名稱的資料框串列中的每個元素創建新變數frame 和它的值等于元素的位置。但我串列中的元素名稱更復雜。這是名稱的兩個示例 - “mean_AST_wind084_ROS007”、“mean_AST_wind177_ROS01”。我要創建的變數是“wind”和“ROS”,值應該是元素名稱中單詞旁邊的數字。以下是創建兩個變數后元素應該是什么樣子的示例:
list_df
$mean_AST_wind177_ROS01
temp wind ROS
1 25 1.77 0.1
2 50 1.77 0.1
3 70 1.77 0.1
4 66 1.77 0.1
5 67 1.77 0.1
$mean_AST_wind084_ROS007
temp wind ROS
1 12 0.84 0.07
2 20 0.84 0.07
3 25 0.84 0.07
4 33 0.84 0.07
5 23 0.84 0.07
我嘗試使用另一篇文章中的代碼一次創建每個變數 (df<-lapply(seq(list_df), function(x) "[[<-"(dfs[[x]], paste0("wind ", x), 值 = x)))。但它沒有用,可能是因為它不正確。非常感謝我如何做到這一點的任何幫助!謝謝!
uj5u.com熱心網友回復:
我們可以使用imap
library(purrr)
library(stringr)
list_df <- imap(list_df, ~ .x %>%
mutate(wind = as.numeric(str_replace(.y,
".*wind(\\d)(\\d ).*", "\\1.\\2")),
ROS = as.numeric(str_replace(.y, ".*ROS(\\d)(\\d ).*", "\\1.\\2"))))
-輸出
list_df
$mean_AST_wind177_ROS01
temp wind ROS
1 25 1.77 0.1
2 50 1.77 0.1
3 70 1.77 0.1
4 66 1.77 0.1
5 67 1.77 0.1
$mean_AST_wind084_ROS007
temp wind ROS
1 12 0.84 0.07
2 20 0.84 0.07
3 25 0.84 0.07
4 33 0.84 0.07
5 23 0.84 0.07
或在base R
list_df <- Map(function(dat, nm) {
transform(dat, wind = as.numeric(sub(".*wind(\\d)(\\d )_.*",
"\\1.\\2", nm)),
ROS = as.numeric(sub(".*ROS(\\d)(\\d )", "\\1.\\2", nm)))
}, list_df, names(list_df))
-輸出
list_df
$mean_AST_wind177_ROS01
temp wind ROS
1 25 1.77 0.1
2 50 1.77 0.1
3 70 1.77 0.1
4 66 1.77 0.1
5 67 1.77 0.1
$mean_AST_wind084_ROS007
temp wind ROS
1 12 0.84 0.07
2 20 0.84 0.07
3 25 0.84 0.07
4 33 0.84 0.07
5 23 0.84 0.07
資料
list_df <- list(mean_AST_wind177_ROS01 = structure(list(temp = c(25L, 50L,
70L, 66L, 67L)), row.names = c("1", "2", "3", "4", "5"), class = "data.frame"),
mean_AST_wind084_ROS007 = structure(list(temp = c(12L, 20L,
25L, 33L, 23L)), row.names = c("1", "2", "3", "4", "5"),
class = "data.frame"))
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/530790.html
標籤:r列表
