2014-12-08 17 views
34

Tôi đang cố gắng để biến một biến mới từ loại tính hàng, nói rowSums như saudplyr đột biến rowSums tính toán hoặc các chức năng tùy chỉnh

iris %>% 
    mutate_(sumVar = 
      iris %>% 
      select(Sepal.Length:Petal.Width) %>% 
      rowSums) 

kết quả được rằng "sumVar" sẽ bỏ bớt giá trị đầu tiên của mình (10.2):

Source: local data frame [150 x 6] 
Groups: <by row> 

    Sepal.Length Sepal.Width Petal.Length Petal.Width Species sumVar 
1   5.1   3.5   1.4   0.2 setosa 10.2 
2   4.9   3.0   1.4   0.2 setosa 10.2 
3   4.7   3.2   1.3   0.2 setosa 10.2 
4   4.6   3.1   1.5   0.2 setosa 10.2 
5   5.0   3.6   1.4   0.2 setosa 10.2 
6   5.4   3.9   1.7   0.4 setosa 10.2 
.. 
Warning message: 
Truncating vector to length 1 

Có nên áp dụng rowwise không? Hoặc động từ thích hợp để sử dụng trong các loại tính toán này là gì.

Edit:

Cụ thể hơn, là có cách nào để thực hiện chức năng inline tùy chỉnh với dplyr?

Tôi tự hỏi nếu nó có thể làm điều gì đó như:

iris %>% 
    mutate(sumVar = colsum_function(Sepal.Length:Petal.Width)) 
+2

Thật lạ rằng 'iris%>% chọn (Sepal.Length: Petal.Width)%>% rowSums()' hoạt động tốt nhưng 'iris%>% đột biến (sumVar = iris%>% chọn (Sepal .Length: Petal.Width)%>% rowSums()) 'ném một" Lỗi: Chỉ số xấu 1 "+ thông điệp cảnh báo. –

+0

Tôi đang cố gắng để làm việc trên nó với các cách tiếp cận khác nhau, nhưng lỗi này xuất hiện rất thường xuyên bằng cách sử dụng '.' (Tôi cũng làm một cái gì đó ngớ ngẩn đôi khi). –

Trả lời

53

Đây là chi tiết của một workaround nhưng có thể được sử dụng

iris %>% mutate(sumVar = rowSums(.[1:4])) 

Theo văn bản trong ý kiến, bạn có thể cũng sử dụng một bên trong biến thể select để nhận các cột bạn muốn tổng hợp, ví dụ:

iris %>% 
    mutate(sumVar = rowSums(select(., contains("Sepal")))) %>% 
    head 

hoặc

iris %>% 
    mutate(sumVar = select(., contains("Sepal")) %>% rowSums()) %>% 
    head 
+0

Bạn đang sử dụng phiên bản 'dplyr' nào? Khi tôi thử ví dụ của bạn với 'dplyr_0.4.1', tôi nhận được một ngoại lệ:' Lỗi trong is.data.frame (x): object '.' không tìm thấy'. – Jubbles

+1

Nếu nó được sử dụng cho bất cứ ai, lý do tại sao tôi đã nhận được lỗi 'Lỗi trong is.data.frame (x): đối tượng '.' không tìm thấy' là vì tôi có một phiên bản cũ của 'magrittr'. Khi tôi cập nhật từ 'magrittr_1.0.1' thành' magrittr_1.5', mọi thứ đều hoạt động tốt. – Jubbles

+0

Câu trả lời rất hữu ích này, tôi đã tự hỏi liệu nó có thể mở rộng bằng cách sử dụng ** 'match' ** hoặc **' chứa' ** của dplyr thay vì '. [1: 4]'? – Konrad

9

Một cách phức tạp hơn sẽ là:

iris %>% select(Sepal.Length:Petal.Width) %>% 
mutate(sumVar = rowSums(.)) %>% left_join(iris) 
+0

Cảm ơn Davide. 'left_join' là một giải pháp tốt nếu sử dụng nó bằng phím' by'; tuy nhiên, nó không quá mạnh mẽ và trực quan cho hoàn cảnh này – leoluyi

5

Thêm bình luận @ docendodiscimus như một câu trả lời. +1 với anh ấy!

iris %>% mutate(sumVar = rowSums(select(., contains("Sepal")))) 
Các vấn đề liên quan