library(tidyverse)
df <- tibble(col1 = c(5, 2), col2 = c(6, 4), col3 = c(9, 9))
df %>% rowwise() %>% mutate(col4 = sd(c(col1, col3)))
# # A tibble: 2 x 4
# col1 col2 col3 col4
# <dbl> <dbl> <dbl> <dbl>
# 1 5 6 9 2.83
# 2 2 4 9 4.95在提出一系列问题之后,我终于可以计算出跨行的标准偏差。请看上面我的代码。
但是我不能在生产代码中使用列名,因为我从其中提取的数据库喜欢定期更改列名。幸运的是,相对列的位置总是一样的。
所以我就用列号代替。让我们检查一下,以确保我可以交换东西进出:
identical(df$col1, df[[1]])
# [1] TRUE是的,我可以用df[[1]]代替df$col1。我想我是这样做的。
df %>% rowwise() %>% mutate(col4 = sd(c(.[[1]], .[[3]])))
# # A tibble: 2 x 4
# col1 col2 col3 col4
# <dbl> <dbl> <dbl> <dbl>
# 1 5 6 9 3.40
# 2 2 4 9 3.40
df %>% rowwise() %>% {mutate(col4 = sd(c(.[[1]], .[[3]])))}
# Error in mutate_(.data, .dots = compat_as_lazy_dots(...)) :
# argument ".data" is missing, with no default 不,这些看起来不起作用,因为结果与我原来的不一样。如果你真的需要知道为什么是I made a separate question的话,我不能使用申请。
df %>% mutate(col4 = apply(.[, c(1, 3)], 1, sd))如何使用列号而不是名称来应用dplyr rowwise()?
发布于 2019-04-25 18:43:31
在执行.[[1]]或.[[3]]之后使用rowwise (按行分组-每个组只有一行)的问题是,它破坏了分组结构并提取了整个列。为了避免这种情况,我们可以在执行row_number()之前创建一个rowwise列,然后根据该索引对列进行子集。
library(dplyr)
df %>%
mutate(rn = row_number()) %>% # create a sequence of row index
rowwise %>%
mutate(col4 = sd(c(.[[1]][rn[1]], .[[3]][rn[1]]))) %>% #extract with index
select(-rn)
#Source: local data frame [2 x 4]
#Groups: <by row>
# A tibble: 2 x 4
# col1 col2 col3 col4
# <dbl> <dbl> <dbl> <dbl>
#1 5 6 9 2.83
#2 2 4 9 4.95或者另一个选项是来自map的purrr,我们在其中循环row_number()并做数据集行的子设置。
library(purrr)
df %>%
mutate(col4 = map_dbl(row_number(), ~ sd(c(df[[1]][.x], df[[3]][.x]))))
# A tibble: 2 x 4
# col1 col2 col3 col4
# <dbl> <dbl> <dbl> <dbl>
#1 5 6 9 2.83
#2 2 4 9 4.95或者另一个选择是pmap (如果我们不想使用row_number())
df %>%
mutate(col4 = pmap_dbl(.[c(1, 3)], ~ sd(c(...))))
# A tibble: 2 x 4
# col1 col2 col3 col4
# <dbl> <dbl> <dbl> <dbl>
#1 5 6 9 2.83
#2 2 4 9 4.95当然,最简单的方法是使用来自rowSds的matrixStats,如带有标签的post here中所描述的
注意:上述所有方法都不需要任何整形。
发布于 2019-04-25 18:44:19
由于您不一定知道列名,而是知道需要标准差等的列的位置,所以我会重新定义为long data,并添加ID列。您可以按位置而不是列名进行收集,方法是提供应该成为键的列的编号,或者将列的编号从键中省略。这样,就不需要按列指定这些值了,因为已经将它们都放在一列中了。然后,您可以将这些摘要值重新加入到原始宽形状数据中。
library(dplyr)
library(tidyr)
df <- tibble(col1 = c(5, 2), col2 = c(6, 4), col3 = c(9, 9)) %>%
mutate(id = row_number())
df %>%
mutate(id = row_number()) %>%
gather(key, value, 1, 3) %>%
group_by(id) %>%
summarise(sd = sd(value)) %>%
inner_join(df, by = "id")
#> # A tibble: 2 x 5
#> id sd col1 col2 col3
#> <int> <dbl> <dbl> <dbl> <dbl>
#> 1 1 2.83 5 6 9
#> 2 2 4.95 2 4 9根据需要按位置重新排列列。
发布于 2019-04-25 18:47:41
提出了一种数据转换、转换为矩阵、计算标准差、再转换、转化为tibble的方法。
df %>%
t %>%
rbind(col4 = c(sd(.[c(1, 3),1]), sd(.[c(1, 3),2]))) %>%
t %>%
as_tibble()https://stackoverflow.com/questions/55855570
复制相似问题