2016-02-16 26 views
6

Tôi có khung dữ liệu và tôi cần phải thêm một cột khác vào cột đó cho biết số lượng NA trong tất cả các cột khác cho hàng đó và cũng là giá trị trung bình của giá trị không phải NA. Tôi nghĩ rằng nó có thể được thực hiện trong dplyr.Thêm cột có số lượng NA và Trung bình bằng R với dplyr

> df1 <- data.frame(a = 1:5, b = c(1,2,NA,4,NA), c = c(NA,2,3,NA,NA)) 
> df1 
    a b c 
1 1 1 NA 
2 2 2 2 
3 3 NA 3 
4 4 4 NA 
5 5 NA NA 

Tôi muốn thay đổi một cột khác đếm số lượng NA trong hàng đó và cột khác hiển thị giá trị trung bình của tất cả các giá trị NON-NA trong hàng đó.

Vui lòng hỗ trợ.

+1

Điều này thường không phải là diễn đàn yêu cầu chúng tôi viết mã cho bạn. Bạn đã thử cái gì? Tại sao bạn muốn sử dụng 'dplyr'? FWIW, điều này có thể được thực hiện trong cơ sở R khá dễ dàng bất kỳ cách nào. Một là: 'df1 $ na <- áp dụng (is.na (df1), 1, tổng)' – Justin

+0

Cách 'dplyr' được mô tả ở đây: http://stackoverflow.com/questions/21818181/applying-a-function -to-every-row-of-a-table-using-dplyr –

Trả lời

9
library(dplyr) 

count_na <- function(x) sum(is.na(x)) 

df1 %>% 
    mutate(means = rowMeans(., na.rm = T), 
     count_na = apply(., 1, count_na)) 
+0

Làm cách nào bạn sửa đổi giải pháp này để chỉ hoạt động trên các cột được chọn? Ví dụ b & c? – radek

+0

@radek xem câu trả lời của tôi trên trang này –

6

Bạn có thể thử này:

#Find the row mean and add it to a new column in the dataframe 
df1$Mean <- rowMeans(df1, na.rm = TRUE) 

#Find the count of NA and add it to a new column in the dataframe 
df1$CountNa <- rowSums(apply(is.na(df1), 2, as.numeric)) 
2

Như đã đề cập ở đây https://stackoverflow.com/a/37732069/2292993

df1 <- data.frame(a = 1:5, b = c(1,2,NA,4,NA), c = c(NA,2,3,NA,NA)) 

df1 %>% 
    mutate(means = rowMeans(., na.rm = T), 
     count_na = rowSums(is.na(.))) 

để làm việc trên cols chọn (ví dụ ở đây là dành cho col a và col c):

df1 %>% 
    mutate(means = rowMeans(., na.rm = T), 
     count_na = rowSums(is.na(select(.,one_of(c('a','c')))))) 
Các vấn đề liên quan