Как добавить столбец после последнего столбца, содержащего определенную строку? - PullRequest
2 голосов
/ 21 апреля 2020

У меня есть такой набор данных

df <- data.frame(abc_1 = 1:10, abc_2 = 11:20, abc_3 = 21:30, somevar = 31:40)
head(df)
   abc_1 abc_2 abc_3 somevar
1      1    11    21      31
2      2    12    22      32
3      3    13    23      33
4      4    14    24      34
5      5    15    25      35
6      6    16    26      36

Я хотел бы вставить новый столбец после abc_3 (в моем случае суммы строк abc_1, abc_2, abc_3). Так как (a) набор данных огромен, (b) я мог бы решить манипулировать набором данных перед добавлением столбца (т.е. испортить индексы столбцов), и, поскольку (c) я хотел бы сделать это для многих переменных, которые содержат некоторые другие строки, я ищу способ сделать это без ссылки на индекс столбца, а путем сопоставления строки ab c.

Я нашел add_column в пакете tibble, но он позволяет только добавить столбец по индексу вот так:

library(tibble)
add_column(df, abc_sum = rowSum(abc_1, abc_2, abc_3), .after = 3)

Мне нужно что-то вроде этого:

   abc_1 abc_2 abc_3 abc_sum somevar
1      1    11    21      33      31
2      2    12    22      36      32
3      3    13    23      39      33
4      4    14    24      42      34
5      5    15    25      45      35
6      6    16    26      48      36

Я хочу заменить .after = 3 на выражение, которое вставляет его после abc_3: соответствует строка abc_3.

Ответы [ 2 ]

2 голосов
/ 21 апреля 2020

Вы можете сделать:

add_column(df, 
           abc_sum = rowSums(df[startsWith(names(df), "abc")]),
           .after = "abc_3")

   abc_1 abc_2 abc_3 abc_sum somevar
1      1    11    21      33      31
2      2    12    22      36      32
3      3    13    23      39      33
4      4    14    24      42      34
5      5    15    25      45      35
6      6    16    26      48      36
7      7    17    27      51      37
8      8    18    28      54      38
9      9    19    29      57      39
10    10    20    30      60      40
1 голос
/ 21 апреля 2020

Мы можем использовать reduce

library(dplyr)
library(purrr)
df %>% 
    mutate(abc_sum = select(., starts_with('abc')) %>%
        reduce(`+`)) %>%
    select(starts_with('abc'), everything())
#   abc_1 abc_2 abc_3 abc_sum somevar
#1      1    11    21      33      31
#2      2    12    22      36      32
#3      3    13    23      39      33
#4      4    14    24      42      34
#5      5    15    25      45      35
#6      6    16    26      48      36
#7      7    17    27      51      37
#8      8    18    28      54      38
#9      9    19    29      57      39
#10    10    20    30      60      40
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...