Добавляйте столбцы с использованием языка Tidyverse, но вместо имен столбцов используйте номера столбцов - PullRequest
2 голосов
/ 25 апреля 2019
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 Ответ

2 голосов
/ 25 апреля 2019

Если оно основано на позиции, используйте 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, нам нужно [[ вместо [ для поднабораодин столбец как vectordf[, 1] или .[,1] это все равно будет tibble с одним столбцом вместо преобразования в vector, как мы думаем о поведении, которое мы находим с data.frame

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...