首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何使用dplyr ``rowwise()‘列号而不是列名

如何使用dplyr ``rowwise()‘列号而不是列名
EN

Stack Overflow用户
提问于 2019-04-25 18:29:05
回答 3查看 482关注 0票数 1
代码语言:javascript
运行
复制
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

在提出一系列问题之后,我终于可以计算出跨行的标准偏差。请看上面我的代码。

但是我不能在生产代码中使用列名,因为我从其中提取的数据库喜欢定期更改列名。幸运的是,相对列的位置总是一样的。

所以我就用列号代替。让我们检查一下,以确保我可以交换东西进出:

代码语言:javascript
运行
复制
identical(df$col1, df[[1]])
# [1] TRUE

是的,我可以用df[[1]]代替df$col1。我想我是这样做的。

代码语言:javascript
运行
复制
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的话,我不能使用申请。

代码语言:javascript
运行
复制
df %>% mutate(col4 = apply(.[, c(1, 3)], 1, sd))

如何使用列号而不是名称来应用dplyr rowwise()

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2019-04-25 18:43:31

在执行.[[1]]或.[[3]]之后使用rowwise (按行分组-每个组只有一行)的问题是,它破坏了分组结构并提取了整个列。为了避免这种情况,我们可以在执行row_number()之前创建一个rowwise列,然后根据该索引对列进行子集。

代码语言:javascript
运行
复制
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

或者另一个选项是来自mappurrr,我们在其中循环row_number()并做数据集行的子设置。

代码语言:javascript
运行
复制
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())

代码语言:javascript
运行
复制
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

当然,最简单的方法是使用来自rowSdsmatrixStats,如带有标签的post here中所描述的

注意:上述所有方法都不需要任何整形。

票数 1
EN

Stack Overflow用户

发布于 2019-04-25 18:44:19

由于您不一定知道列名,而是知道需要标准差等的列的位置,所以我会重新定义为long data,并添加ID列。您可以按位置而不是列名进行收集,方法是提供应该成为键的列的编号,或者将列的编号从键中省略。这样,就不需要按列指定这些值了,因为已经将它们都放在一列中了。然后,您可以将这些摘要值重新加入到原始宽形状数据中。

代码语言:javascript
运行
复制
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

根据需要按位置重新排列列。

票数 1
EN

Stack Overflow用户

发布于 2019-04-25 18:47:41

提出了一种数据转换、转换为矩阵、计算标准差、再转换、转化为tibble的方法。

代码语言:javascript
运行
复制
df %>%
  t %>%
  rbind(col4 = c(sd(.[c(1, 3),1]), sd(.[c(1, 3),2]))) %>%
  t %>%
  as_tibble()
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55855570

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档