关于你的问题(1),问题中的代码与以下代码的作用相同:
df %>% rowwise() %>% mutate(minval_X3_X8 = min(X3))
或者只是
df %>% rowwise() %>% mutate(minval_X3_X8 = X3)
对于下面问题(1)中的问题(2),我们重新调整您的解决方案,以使其正常工作,并在此基础上提供一些其他的dplyr和base解决方案。在下面的解决方案中,我们已经展示了min
和max
的结果。通过向mutate
或summarize
添加参数或扩展aggregate
函数,可以轻松地将它们扩展到其他统计数据,如mean
、sd
、median
等。
请注意,下面的解决方案都使用简单的min
、max
等,这使得将其扩展到其他统计数据更加容易。使用do
来修改您的代码。在do
中,一个点将指向当前组,也就是当前行,但它将是一个列表,因此需要将其转换回数据框。请注意,我们在do
中使用了{...}
来防止{...}
内的点引用当前行作为列表,而是引用data.frame(.)
。
df %>%
rowwise %>%
do(as.data.frame(.) %>% {
subs <- select(., X3:X8)
mutate(., Min = subs %>% min,
Max = subs %>% max)
} ) %>%
ungroup
提供:
# A tibble: 10 x 13
id X1 X2 X3 X4 X5 X6 O6 X8 X9 X10 Min Max
* <fct> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
1 a 0.602 0.989 0.105 0.842 0.804 0.659 0.499 0.658 0.915 0.429 0.105 0.842
2 b 0.195 0.815 0.646 0.447 0.793 0.107 0.257 0.122 0.457 0.330 0.107 0.793
3 c 0.966 0.254 0.509 0.965 0.358 0.148 0.492 0.516 0.921 0.753 0.148 0.965
4 d 0.651 0.687 0.707 0.141 0.0580 0.928 0.117 0.302 0.259 0.844 0.0580 0.928
5 e 0.367 0.831 0.862 0.777 0.566 0.476 0.513 0.760 0.344 0.0109 0.476 0.862
6 f 0.602 0.989 0.105 0.842 0.804 0.659 0.499 0.658 0.915 0.429 0.105 0.842
7 g 0.195 0.815 0.646 0.447 0.793 0.107 0.257 0.122 0.457 0.330 0.107 0.793
8 h 0.966 0.254 0.509 0.965 0.358 0.148 0.492 0.516 0.921 0.753 0.148 0.965
9 i 0.651 0.687 0.707 0.141 0.0580 0.928 0.117 0.302 0.259 0.844 0.0580 0.928
10 j 0.367 0.831 0.862 0.777 0.566 0.476 0.513 0.760 0.344 0.0109 0.476 0.862
2)应用使用apply
:
df %>% {
Apply <- function(fun) select(., X3:X8) %>% apply(1, fun)
mutate(., Min = Apply(min), Max = Apply(max))
}
2a) 在基本R中或仅使用基本R:
Apply <- function(fun) apply(subset(df, select = X3:X8), 1, fun)
transform(df, Min = Apply(min), Max = Apply(max))
3) dplyr/tidyr 另一种可能性是使用 dplyr 和 tidyr 将 df
转换为长格式,以长格式执行计算,然后再连接回 df
:
library(dplyr)
library(tidyr)
df %>%
left_join({
gather(., key, value, -id) %>%
filter(between(key, "X3", "X8")) %>%
group_by(id) %>%
summarize(Min = min(value), Max = max(value)) %>%
ungroup
})
3a) 基础R (3) 可以使用R基础语言中的reshape
创建长格式数据框,使用subset
将其缩小至X3:X8,并使用merge执行连接操作。
long <- reshape(df, dir = "long", varying = list(names(df)[-1]),
times = names(df)[-1], v.names = "min")
subs <- subset(long, time >= "X3" & time <= "X8")
merge(df, aggregate(min ~ id, subs, function(x) c(Min = min(x), Max = max(x))))
4) dplyr/purrr这个跟(2)很相似,只不过我们使用的是purrr::pmap_dbl
而不是apply
。
library(dplyr)
library(purrr)
df %>% {
Pmap <- function(fun) select(., X3:X8) %>% pmap_dbl(~ fun(c(...)))
mutate(., Min = Pmap(min), Max = Pmap(max))
}
更新
已经进行了一些改进并增加了额外的解决方案。
X3:X8
)在select
中有效,但在mutate
或相关函数中调用时无效。(如果有人知道不同,请告诉我。) - r2evansmutate
中使用select
。该页面上有一个非官方的“解决方案”。然而,当我尝试将其用于此上下文时,它未能正常工作:https://github.com/tidyverse/dplyr/issues/2050 - DTYK