[英]How to aggregate rows that contain NA values in R
我想從這個 go :
City State x1 x2 x3
NA CA 10 10 10
SD CA 10 10 10
NA CA 10 10 10
SF CA 10 10 10
FW TX 5 5 5
NA TX 5 5 5
NA TX 5 5 5
對此:
State sum
CA 120
TX 45
col1 <- c(NA,'SD',NA,'SF','FW', NA, NA)
col2 <- c('CA', 'CA', 'CA', 'CA', 'TX', 'TX', 'TX')
col3 <- c(10,10,10,10,5,5,5)
col4 <- c(10,10,10,10,5,5,5)
col5 <- c(10,10,10,10,5,5,5)
df <- data.frame(City=col1, State=col2, x1=col3, x2=col4,x3=col5)
col6 <- c('CA', 'TX')
col7 <- c(120, 45)
solution <- data.frame(State=col6, sum=col7)
編輯:修復了數據框中的錯誤。 並將“NA”更改為 NA。 感謝 Ronak 如此迅速地回復。
@Ronak Shah 解決方案要好得多,但這是另一個更長但仍然有效的解決方案,可以為將來了解一些有用的功能:
library(dplyr)
df %>%
group_by(State) %>%
summarise(across(x1:x3, ~ sum(.x, na.rm = TRUE))) %>% # We use across() for column-wise operations
rowwise() %>%
mutate(sum = sum(c_across(x1:x3), na.rm = TRUE)) %>% # We use rowwise() function + c_across() for row wise operations
select(-c(x1:x3))
# A tibble: 2 x 2
# Rowwise:
State sum
<chr> <int>
1 CA 120
2 TX 45
這也非常有用,並且更接近於上面提到的那個:
df %>%
group_by(State) %>%
summarise(sum = sum(c_across(x1:x3), na.rm = TRUE))
# A tibble: 2 x 2
State sum
<chr> <int>
1 CA 120
2 TX 45
您可以對 dplyr 中的dplyr
cur_data()
中的列進行子集化。
library(dplyr)
df %>%
group_by(State) %>%
summarise(sum = sum(select(cur_data(), x1:x3), na.rm = TRUE))
# State sum
# <chr> <int>
#1 CA 120
#2 TX 45
數據
df <- structure(list(City = c(NA, "SD", NA, "SF", "FW", NA, NA), State = c("CA",
"CA", "CA", "CA", "TX", "TX", "TX"), x1 = c(10L, 10L, 10L, 10L,
5L, 5L, 5L), x2 = c(10L, 10L, 10L, 10L, 5L, 5L, 5L), x3 = c(10L,
10L, 10L, 10L, 5L, 5L, 5L)), class = "data.frame", row.names = c(NA, -7L))
我們可以使用data.table
方法來提高效率。 將 data.frame 轉換為 'data.table ( setDT(df)
),按 'State 分組,將列指定為.SDcols
中的列名pattern
,獲取rowSums
( .SD
) 的子集的 rowSums 並sum
library(data.table)
setDT(df)[ , sum(rowSums(.SD), na.rm = TRUE), State,
.SDcols = patterns('^x\\d+$')]
# State V1
#1: CA 120
#2: TX 45
df <- structure(list(City = c(NA, "SD", NA, "SF", "FW", NA, NA), State = c("CA",
"CA", "CA", "CA", "TX", "TX", "TX"), x1 = c(10L, 10L, 10L, 10L,
5L, 5L, 5L), x2 = c(10L, 10L, 10L, 10L, 5L, 5L, 5L), x3 = c(10L,
10L, 10L, 10L, 5L, 5L, 5L)), class = "data.frame",
row.names = c(NA, -7L))
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.