Tôi không thể sử dụng công tắc bên trong của mutate
vì nó trả về toàn bộ véc tơ thay vì chỉ là hàng. Là một hack, tôi đang sử dụng:Có chức năng nào giống như công tắc hoạt động bên trong dplyr :: mutate không?
pick <- function(x, v1, v2, v3, v4) {
ifelse(x == 1, v1,
ifelse(x == 2, v2,
ifelse(x == 3, v3,
ifelse(x == 4, v4, NA))))
}
Điều này hoạt động bên trong mutate
và bây giờ là vì tôi thường chọn trong số 4 điều, nhưng điều đó có thể thay đổi. Bạn có thể giới thiệu một giải pháp thay thế không?
Ví dụ:
library(dplyr)
df.faithful <- tbl_df(faithful)
df.faithful$x <- sample(1:4, 272, rep=TRUE)
df.faithful$y1 <- rnorm(n=272, mean=7, sd=2)
df.faithful$y2 <- rnorm(n=272, mean=5, sd=2)
df.faithful$y3 <- rnorm(n=272, mean=7, sd=1)
df.faithful$y4 <- rnorm(n=272, mean=5, sd=1)
Sử dụng pick
:
mutate(df.faithful, y = pick(x, y1, y2, y3, y4))
Source: local data frame [272 x 8]
eruptions waiting x y1 y2 y3 y4 y
1 3.600 79 1 8.439092 5.7753006 8.319372 5.078558 8.439092
2 1.800 54 2 13.515956 6.1971512 6.343157 4.962349 6.197151
3 3.333 74 4 7.693941 6.8973365 5.406684 5.425404 5.425404
4 2.283 62 4 12.595852 6.9953995 7.864423 3.730967 3.730967
5 4.533 85 3 11.952922 5.1512987 9.177687 5.511899 9.177687
6 2.883 55 3 7.881350 1.0289711 6.304004 3.554056 6.304004
7 4.700 88 4 8.636709 6.3046198 6.788619 5.748269 5.748269
8 3.600 85 1 8.027371 6.3535056 7.152698 7.034976 8.027371
9 1.950 51 1 5.863370 0.1707758 5.750440 5.058107 5.863370
10 4.350 85 1 7.761653 6.2176610 8.348378 1.861112 7.761653
.. ... ... . ... ... ... ... ...
Chúng tôi thấy rằng tôi sao chép giá trị từ y1 vào y nếu x == 1, và vân vân. Đây là những gì tôi đang tìm kiếm để làm, nhưng muốn có thể làm điều đó, cho dù tôi có một danh sách 4 hoặc 400 cột.
Cố gắng sử dụng switch
:
mutate(df.faithful, y = switch(x, y1, y2, y3, 4))
Error in switch(c(1L, 2L, 4L, 4L, 3L, 3L, 4L, 1L, 1L, 1L, 4L, 3L, 1L, :
EXPR must be a length 1 vector
Cố gắng sử dụng list
:
mutate(df.faithful, y = list(y1, y2, y3, y4)[[x]])
Error in list(c(8.43909205142925, 13.5159559591257, 7.69394050059568, :
recursive indexing failed at level 2
Cố gắng sử dụng c
:
mutate(df.faithful, y = c(y1, y2, y3, y4)[x])
Source: local data frame [272 x 8]
eruptions waiting x y1 y2 y3 y4 y
1 3.600 79 1 8.439092 5.7753006 8.319372 5.078558 8.439092
2 1.800 54 2 13.515956 6.1971512 6.343157 4.962349 13.515956
3 3.333 74 4 7.693941 6.8973365 5.406684 5.425404 12.595852
4 2.283 62 4 12.595852 6.9953995 7.864423 3.730967 12.595852
5 4.533 85 3 11.952922 5.1512987 9.177687 5.511899 7.693941
6 2.883 55 3 7.881350 1.0289711 6.304004 3.554056 7.693941
7 4.700 88 4 8.636709 6.3046198 6.788619 5.748269 12.595852
8 3.600 85 1 8.027371 6.3535056 7.152698 7.034976 8.439092
9 1.950 51 1 5.863370 0.1707758 5.750440 5.058107 8.439092
10 4.350 85 1 7.761653 6.2176610 8.348378 1.861112 8.439092
.. ... ... . ... ... ... ... ...
Không có lỗi được sản xuất, nhưng hành vi đó không phải là như dự định.
Đó là một câu hỏi thú vị nhưng sẽ tốt hơn nếu bạn có thể làm cho nó có thể tái sản xuất với một ví dụ làm việc tối thiểu. Trong biểu mẫu hiện tại, có vẻ như bạn có thể thử 'danh sách (v1, v2, v3, v4) [[x]]' thay thế. –
Nhận xét hợp lệ. Bạn có thể nói những gì tôi yêu cầu bây giờ không? – wdkrnls
Sử dụng 'd%>% biến đổi (y = cbind (y1, y2, y3, y4) [cbind (1: n(), x)])' hoặc 'd $ y <- as.data.frame (d) [cbind (1: nrow (d), d $ x + 3)] ' –