我有以下 2 個單獨的資料框:
| 伊藤斯 | sp1 | sp2 |
|---|---|---|
| 專案 1 | 20 | 10 |
| 專案 2 | 30 | 15 |
| 第 3 項 | 30 | 15 |
| 第 4 項 | 30 | 15 |
和
| 伊藤斯 | sp5 | sp6 |
|---|---|---|
| 第7項 | 20 | 10 |
| 第8項 | 30 | 15 |
| 第9項 | 30 | 15 |
我怎么能在 R 中創建一個產生以下結果的函式?
| sps | 和 | N |
|---|---|---|
| sp1 | 110 | 4 |
| sp2 | 55 | 4 |
| sp5 | 80 | 3 |
| sp6 | 40 | 3 |
在這個新資料框中,每個 N 和 sum 列是每個物種 (sps) 的數量和總和。
謝謝
uj5u.com熱心網友回復:
df1 <- structure(list(itens = c("item1", "item2", "item3", "item4"),
sp1 = c(20L, 30L, 30L, 30L),
sp2 = c(10L, 15L, 15L, 15L)),
class = "data.frame", row.names = c(NA, -4L))
df2 <- structure(list(itens = c("item7", "item8", "item9"),
sp5 = c(20L, 30L, 30L),
sp6 = c(10L, 15L, 15L)),
class = "data.frame", row.names = c(NA, -3L))
解決方案不是使用回圈而是 tidyr::pivot_longer and dplyr::full_join
library(dplyr)
library(tidyr)
df1 %>%
pivot_longer(-itens) %>%
full_join(df2 %>% pivot_longer(-itens)) %>%
group_by(sps = name) %>%
summarise(N = n(),
sum = sum(value))
回傳:
sps N sum
<chr> <int> <int>
1 sp1 4 110
2 sp2 4 55
3 sp5 3 80
4 sp6 3 40
uj5u.com熱心網友回復:
另一個解決方案,基于dplyr::bind_rowsand tidyr::pivot_longer:
library(tidyverse)
df1 <- data.frame(
stringsAsFactors = FALSE,
itens = c("item1", "item2", "item3", "item4"),
sp1 = c(20L, 30L, 30L, 30L),
sp2 = c(10L, 15L, 15L, 15L)
)
df2 <- data.frame(
stringsAsFactors = FALSE,
itens = c("item7", "item8", "item9"),
sp5 = c(20L, 30L, 30L),
sp6 = c(10L, 15L, 15L)
)
df1 %>%
bind_rows(df2) %>%
pivot_longer(-itens, names_to = "sps") %>%
group_by(sps) %>%
summarise(sum = sum(value,na.rm = T), N = sum(!is.na(value)))
#> # A tibble: 4 × 3
#> sps sum N
#> <chr> <int> <int>
#> 1 sp1 110 4
#> 2 sp2 55 4
#> 3 sp5 80 3
#> 4 sp6 40 3
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/347393.html
