簡體   English   中英

如何在 R 中聚合包含 NA 值的行

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM