2015-07-02 19 views
5

Trong dplyr, làm thế nào để bạn thực hiện tổng kết hàng nghìn cột đã chọn (sử dụng chỉ mục cột)?Làm thế nào để thực hiện tổng kết hàng tuần trên các cột được chọn bằng cách sử dụng chỉ mục cột với dplyr?

này không hoạt động

> iris %>% mutate(sum=sum(.[1:4])) %>% head 
    Sepal.Length Sepal.Width Petal.Length Petal.Width Species sum 
1   5.1   3.5   1.4   0.2 setosa 2078.7 
2   4.9   3.0   1.4   0.2 setosa 2078.7 
3   4.7   3.2   1.3   0.2 setosa 2078.7 
4   4.6   3.1   1.5   0.2 setosa 2078.7 
5   5.0   3.6   1.4   0.2 setosa 2078.7 
6   5.4   3.9   1.7   0.4 setosa 2078.7 

tôi có thể làm những điều sau đây, nhưng nó không đẹp

> iris %>% mutate(index=1:n()) %>% 
       gather("param", "value", 1:4) %>% 
       group_by(index) %>% 
       mutate(sum=sum(value)) %>% 
       spread(param, value) %>% select(-index) 
Source: local data frame [150 x 6] 

    Species sum Sepal.Length Sepal.Width Petal.Length Petal.Width 
1 setosa 10.2   5.1   3.5   1.4   0.2 
2 setosa 9.5   4.9   3.0   1.4   0.2 
3 setosa 9.4   4.7   3.2   1.3   0.2 
4 setosa 9.4   4.6   3.1   1.5   0.2 
5 setosa 10.2   5.0   3.6   1.4   0.2 
6 setosa 11.4   5.4   3.9   1.7   0.4 
7 setosa 9.7   4.6   3.4   1.4   0.3 
8 setosa 10.1   5.0   3.4   1.5   0.2 
9 setosa 8.9   4.4   2.9   1.4   0.2 
10 setosa 9.6   4.9   3.1   1.5   0.1 
..  ... ...   ...   ...   ...   ... 

Có cú pháp nhiều cách đẹp hơn để đạt được điều này?

EDIT: Đó là khác biệt so với các câu hỏi khác, bởi vì tôi muốn thực hiện hành động rowwise trên cột bằng sử dụng chỉ số cột "

+6

Thử 'iris%>% mutate (sum = Reduce (" + ",. [1: 4]))'. Ngoài ra, hàm 'rowSums' cơ sở làm những gì bạn đang yêu cầu. – nicola

+2

có thể trùng lặp của [Áp dụng hàm cho mỗi hàng của bảng bằng dplyr?] (Http://stackoverflow.com/questions/21818181/applying-a-function-to-every-row-of-a-table-using -dplyr) – jeremycg

+0

'dplyr' cung cấp hàm' rowwise' có thể hữu ích. – SabDeM

Trả lời

7

Như đã nói trong các bình luận, bạn có thể hoàn thành nhiệm vụ của bạn với:

iris %>% mutate(sum=Reduce("+",.[1:4])) 

Trong trường hợp này cũng là cơ sở rowSums công trình:

iris$sum<-rowSums(iris[,1:4]) 
2

Bạn có thể (ab) sử dụng lựa chọn cơ sở R của subset, cho phép lựa chọn các cột bằng số:

iris %>% subset(select=1:4) %>% mutate(sum=rowSums(.)) 
+3

Hàm 'dplyr'' select' có vẻ hoạt động tốt: 'iris%>% select (1: 4)%>% mutate (sum = rowSums (.))' ..? – Frank

0

Không chắc điều này là đúng nghi thức nhưng tôi thích để tái chế chủ đề này thay vì bắt đầu một cái mới được đưa ra, tôi khá chắc chắn, tôi đang làm chỉ là một sai lầm tân binh .

Tại sao làm việc này chứ:

test$sum <- Reduce("+", test[,3:ncol(test)]) 

trong khi điều này (đối với tôi giống hệt nhau) không?

test %>% 
    mutate(sum = Reduce("+",.[3:ncol(.)])) 

Các lỗi nhất định là

Error in mutate_impl(.data, dots) : 
    Column `sum` must be length 1 (the group size), not 915 

Tôi đập đầu của tôi trên bàn làm việc kể từ khi 30' hoặc lâu hơn!

Tôi ước tôi có thể cung cấp cho bạn tập dữ liệu cơ bản nhưng tôi thực sự không thể.

Cột 1: 2 là trường văn bản trong khi 3: ncol (.) Là TRUE/FALSE (hợp lý). ncol (.) = 33.

Các vấn đề liên quan