使用tidyverse语言添加列,但使用列号代替列名

时间:2019-04-25 15:53:15

标签: r dplyr

library(tidyverse)
df <- tibble(col1 = c(5, 2), col2 = c(6, 4), col3 = c(9, 9))
# # A tibble: 2 x 3
#    col1  col2  col3
#   <dbl> <dbl> <dbl>
# 1     5     6     9
# 2     2     4     9

我需要添加第1列和第3列。但是列名经常更改。因此,我只能使用列号而不是实际的列名。

尝试1可以正常工作。
尝试2和3不起作用。

我的语法出了什么问题?我不能使用尝试1,因为下个月列名称可能会有所不同,但是它们的相对位置将保持不变。

df %>% mutate(col4 = col1 + col3)        # attempt 1
df %>% mutate(col4 = .[, 1] + .[, 3])    # attempt 2
df %>% {mutate(col4 = .[, 1] + .[, 3])}  # attempt 3

1 个答案:

答案 0 :(得分:2)

如果它是基于位置的,请根据列索引对列进行子设置,以使用rowSums。好处是我们也可以照顾NA元素(如果有)

df %>% 
  mutate(col4 = rowSums(.[c(1, 3)], na.rm = TRUE))
# A tibble: 2 x 4
#   col1  col2  col3  col4
#  <dbl> <dbl> <dbl> <dbl>
#1     5     6     9    14
#2     2     4     9    11

关于OP的问题,我们需要[[而不是[来将单个列设置为vector。使用df[, 1].[,1]时,它仍将是具有一列的tibble,而不是转换为vector时,因为我们想到的是data.frame < / p>

df %>% 
     mutate(col4 = .[[1]] + .[[3]])
# A tibble: 2 x 4
#   col1  col2  col3  col4
#  <dbl> <dbl> <dbl> <dbl>
#1     5     6     9    14
#2     2     4     9    11