[英]R: Extract parameter from list
我正在使用 R 並有一個相當級聯的數據列表,我想從中提取每個數據幀的相同變量。 這是一個 imported.csv 文件的示例(從原始版本簡化而來,我希望不會太混亂):
Temp(A); Density(B); Velocity(C)
21,54; 0,7; 1486,46
20,87; 0,76; 1484,42
20,34; 0,81; 1482,8
19,61; 0,81; 1480,5
# .csv files imported with:
data_files <- list.files("D:\\My\\data\\pathway")
我用來從 19 個數據幀創建列表的代碼如下:
lst1 <- map(data_files, ~ {
data1 <- read.csv2(paste0("D:\\My\\data\\pathway\\", .x))
df.sum <- data1 %>%
select(Temperature(A), Density(B), Velocity(C)) %>%
summarise_each(funs(min = min, # in the example Min(1)
q25 = quantile(., 0.25), # Max(2)
median = median, # Mean(3)
q75 = quantile(., 0.75), # St.Dev.(4)
max = max,
mean = mean,
sd = sd))
df.stats.tidy <- df.sum %>% gather(stat, val) %>%
separate(stat, into = c("var", "stat"), sep = "_") %>%
spread(stat, val) %>%
select(var, min, q25, median, q75, max, mean, sd)
return(df.stats.tidy)
})
lst1
輸出列表如下所示:
這是我打開整個列表時列出的方式。 當我打開單個數據集的特定表時,該表被轉置:
例如,我如何提取每個數據集的溫度以創建繪圖或進行統計測試?
我嘗試了一些簡單的方法,並且能夠從單個數據集中提取單個值。 因此,我能夠提取數據集 2 的每個參數的平均值。 然而,這並不是我所需要的,因為我需要所有不同數據集的相同參數的相同值。 有沒有人知道破譯此列表順序的簡單方法? 我無法找出欄桿的確切定義方式。
ps這里是dput()的結果:
> dput(lst1[1:2])
list(structure(list(var = c("Conduct.mS.cm.", "Depth.m.", "Salinity.psu.",
"Sound.Velocity.m.sec.", "Temp.C."), min = c(0, -1.19, 0, 1402.98,
-1.48), q25 = c(0.01, -0.91, 0.01, 1412.835, -0.51), median = c(9.225,
-0.78, 9.885, 1421.785, 0.85), q75 = c(25.575, 39.9725, 31.0825,
1440.7175, 2.09), max = c(26.28, 143.76, 32.02, 1453.52, 11.81
), mean = c(11.6531756756757, 23.0201351351351, 13.9187162162162,
1426.98621621622, 1.26290540540541), sd = c(11.8954355870503,
38.217076230762, 14.4467518784427, 14.8016328574063, 2.53744347569587
)), class = "data.frame", row.names = c(NA, -5L)), structure(list(
var = c("Conduct.mS.cm.", "Depth.m.", "Salinity.psu.", "Sound.Velocity.m.sec.",
"Temp.C."), min = c(0, -2.17, 0, 1401.46, -1.44), q25 = c(0,
-1.14, 0, 1404.25, 0.0125), median = c(0.13, -1.08, 0.115,
1413.215, 0.49), q75 = c(25.035, 6.3225, 30.3525, 1440.2625,
1.53), max = c(26.35, 129.54, 32.11, 1486.46, 21.54), mean = c(7.78810344827586,
17.3289655172414, 9.34528735632184, 1424.01396551724, 2.13511494252874
), sd = c(11.6263191741139, 36.9663620576755, 14.0549552563496,
22.6029377552219, 5.01839273011273)), class = "data.frame", row.names = c(NA,
-5L)))
嵌套列表很快就會失控並且不適合分析,因為幾乎所有 R 函數都更期望數據幀(這也是增強的列表)。 但是,您很幸運,因為列表中的數據框看起來相當同質(所有 dim = 5x8 )。 所以你可以將它們綁定到一個數據框。
## unlisting:
my_df<-purrr::map_df(mylist, ~as.data.frame(.x), .id="List")
您現在有一個“列表”列,它指定數據來自哪個列表
現在可以在按"var"
分組的計算中使用此 df
## summarizing mean of variable min and max across both lists
my_df %>% group_by(var) %>% summarise_at(c("min","max"),~mean(.x))
A tibble: 5 × 3
var min max
<chr> <dbl> <dbl>
1 Conduct.mS.cm. 0 26.3
2 Depth.m. -1.68 137.
3 Salinity.psu. 0 32.1
4 Sound.Velocity.m.sec. 1402. 1470.
5 Temp.C. -1.46 16.7
您還可以更進一步,將數據轉換為長格式:
## Option 2 making a long df
my_df_long<-my_df %>% tidyr::pivot_longer(min:sd,names_to = "metric")
> my_df_long
# A tibble: 70 × 4
List var metric value
<chr> <chr> <chr> <dbl>
1 1 Conduct.mS.cm. min 0
2 1 Conduct.mS.cm. q25 0.01
3 1 Conduct.mS.cm. median 9.22
4 1 Conduct.mS.cm. q75 25.6
5 1 Conduct.mS.cm. max 26.3
6 1 Conduct.mS.cm. mean 11.7
7 1 Conduct.mS.cm. sd 11.9
8 1 Depth.m. min -1.19
9 1 Depth.m. q25 -0.91
10 1 Depth.m. median -0.78
# … with 60 more rows
相同的匯總函數現在看起來像這樣。
## summarizing mean of variable min and max across both lists
my_df_long %>%
group_by(var,metric) %>%
filter(metric %in% c("min","max")) %>%
summarise(mean(value))
# A tibble: 10 × 3
# Groups: var [5]
var metric `mean(value)`
<chr> <chr> <dbl>
1 Conduct.mS.cm. max 26.3
2 Conduct.mS.cm. min 0
3 Depth.m. max 137.
4 Depth.m. min -1.68
但是,這是角色偏好。
或許您可以找到一種不首先創建列表的方法,然后您可以省去額外的步驟。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.