Как добиться большой таблицы, разделенной столбцом, с помощью transmute_if/transmute_at

У меня есть таблетка, скажем:

> library(tibble)
> as_tibble(iris)
# A tibble: 150 x 5
   Sepal.Length Sepal.Width Petal.Length Petal.Width Species
          <dbl>       <dbl>        <dbl>       <dbl>  <fctr>
 1          5.1         3.5          1.4         0.2  setosa
 2          4.9         3.0          1.4         0.2  setosa
 3          4.7         3.2          1.3         0.2  setosa
 4          4.6         3.1          1.5         0.2  setosa
 5          5.0         3.6          1.4         0.2  setosa
 6          5.4         3.9          1.7         0.4  setosa
 7          4.6         3.4          1.4         0.3  setosa
 8          5.0         3.4          1.5         0.2  setosa
 9          4.4         2.9          1.4         0.2  setosa
10          4.9         3.1          1.5         0.1  setosa
# ... with 140 more rows

Могу ли я разделить каждый столбец, скажем, на Petal.width, используя transmute_if или transmute_at?

Что-то вроде

> iris[,-c(5)]/iris[,4]
    Sepal.Length Sepal.Width Petal.Length Petal.Width
1      25.500000   17.500000     7.000000           1
2      24.500000   15.000000     7.000000           1
3      23.500000   16.000000     6.500000           1
4      23.000000   15.500000     7.500000           1
5      25.000000   18.000000     7.000000           1
6      13.500000    9.750000     4.250000           1
7      15.333333   11.333333     4.666667           1
8      25.000000   17.000000     7.500000           1
9      22.000000   14.500000     7.000000           1
10     49.000000   31.000000    15.000000           1
11     27.000000   18.500000     7.500000           1

Но не зная точных имен переменных, только окончание .Length и .Width

Спасибо,


person axiom    schedule 16.01.2018    source источник
comment
В dplyr есть функция ends_with   -  person Sotos    schedule 16.01.2018
comment
Я попробовал комбинацию transmute_if(ends_with())`. Кажется, это не работает.   -  person axiom    schedule 16.01.2018


Ответы (1)


Мы можем использовать любой из них. Разница в том, что мы хотим сделать преобразование только для numeric столбцов, тогда transmute_if будет более подходящим, избегая индексации или по именам столбцов.

iris %>% 
   as_tibble %>% 
   transmute_if(is.numeric, funs(./iris$Petal.Width))

Если мы уже знаем имена столбцов или индекс, можно использовать transmute_at

iris %>%
   as_tibble %>%
   transmute_at(1:4, funs(./iris$Petal.Width))

Если это относится к определенному набору столбцов, скажем, те, которые имеют «Ширина» в качестве суффикса в именах столбцов.

iris %>%
    as_tibble %>% 
    transmute_at(vars(ends_with("Width")), funs(./iris$Petal.Width))

Если вы хотите сохранить и другие столбцы, используйте mutate_at

iris %>%
    as_tibble %>% 
    mutate_at(vars(ends_with("Width")), funs(./iris$Petal.Width))
person akrun    schedule 16.01.2018
comment
Есть и другие числовые столбцы, которые я хотел бы исключить. Может ли transmute_if выбрать имена переменных? - person axiom; 16.01.2018
comment
@axiom Если это так, используйте transmute_at, передав индекс или фактические имена столбцов, или, если есть шаблоны, используйте matches и т. д. - person akrun; 16.01.2018
comment
iris %>% as_tibble %>% transmute_at(vars(ends_with("Width")), funs(./iris$Petal.Width)) отлично работает. Спасибо! Еще один вопрос. Как сохранить столбцы, не прошедшие деление? Произнесите столбец Species. - person axiom; 16.01.2018
comment
@axiom В этом случае просто используйте mutate_at вместо transmute_at, поскольку transmute дает только вывод столбцов, которые вы передали - person akrun; 16.01.2018
comment
Красивый. Большое спасибо - person axiom; 16.01.2018