假設我有多個具有相同前綴和相同結構的資料框。
mydf_1 <- data.frame('fruit' = 'apples', 'n' = 2)
mydf_2 <- data.frame('fruit' = 'pears', 'n' = 0)
mydf_3 <- data.frame('fruit' = 'oranges', 'n' = 3)
我有一個 for 回圈,它可以抓取所有帶有此前綴的表,并附加那些匹配特定條件的表。
res <- data.frame()
for(i in mget(apropos("^mydf_"), envir = .GlobalEnv)){
if(sum(i$n) > 0){
res <- rbind.data.frame(res, data.frame('name' = paste0(i[1]),
'n' = sum(i$n)))
}
}
res
這很好用,但我希望我的“res”表在“name”列中識別原始資料框本身的名稱,而不是列名。我想要的結果是:
我最接近解決這個問題的是:
'name' = paste0(substitute(i))
代替
'name' = paste0(i[1])
但它只回傳'i'。
有什么簡單的解決辦法嗎?堿是首選但不是必需的。
uj5u.com熱心網友回復:
正如評論中提到的,最好將資料框放入串列中,因為它更容易處理和操作它們。但是,我們仍然可以從全域環境中獲取資料幀,獲取每個資料幀的總和,然后將它們系結在一起并將資料幀名稱添加為一行。
library(tidyverse)
df_list <-
do.call("list", mget(grep("^mydf_", names(.GlobalEnv), value = TRUE))) %>%
map(., ~ .x %>% summarise(n = sum(n))) %>%
discard(~ .x == 0) %>%
bind_rows(., .id = "name")
或者我們可以使用map_dfr
系結在一起進行匯總,然后過濾掉 0 值:
map_dfr(mget(ls(pattern = "^mydf_")), ~ c(n = sum(.x$n)), .id = "name") %>%
filter(n != 0)
輸出
name n
1 mydf_1 2
2 mydf_3 3
uj5u.com熱心網友回復:
要系結 data.frames 串列并將串列名稱存盤為新列,一種方便的方法是將 arg 設定.id
為dplyr::bind_rows()
.
library(dplyr)
mget(apropos("^mydf_")) %>%
bind_rows(.id = "name") %>%
count(name, wt = n) %>%
filter(n > 0)
# name n
# 1 mydf_1 2
# 2 mydf_3 3
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/470689.html
下一篇:如何列印所有輸入的總和?