Разделите все столбцы на выбранный столбец, используя mutate_all - PullRequest
0 голосов
/ 04 января 2019

У меня есть пример фрейма данных, который выглядит следующим образом (мой полный фрейм данных имеет «d» плюс 57 элементов):

d <- seq(0, 100, 0.5) 
Fe <- runif(201, min = 0, max = 1000) 
Ca <- runif(201, min = 0, max = 1000) 
Zr <- runif(201, min = 0, max = 1000) 
Ti <- runif(201, min = 0, max = 1000) 
Al <- runif(201, min = 0, max = 1000) 
example <- data.frame(d, Fe, Ca, Zr, Ti, Al)
Ratio_Elements <- c("Fe", "Ti", "Zr", "d") #this subset of the 
dataframe is user defined
Detrital_Divisor <- "Zr"

Detrital_Divisor может меняться в зависимости от ввода пользователя, но всегда будет столбцомв «примере» данных.Я хотел бы разделить все оставшиеся столбцы на столбец Detrital_Divisor, предпочтительно с использованием канала.Прямо сейчас у меня есть:

Example_Ratio <- example %>%
select (Ratio_Elements) #to subset to the user selected elements
mutate_all(./Detrital_Divisor)

Но я получаю ошибку:

Error in Ops.data.frame(., Detrital_Divisor) : 
  ‘/’ only defined for equally-sized data frames.

Я также пытался:

Example_Ratio <- example %>%
select (Ratio_Elements)
sweep(., Detrital_Divisor, MARGIN = 1, '/')

на основе аналогичных вопросов, которые былиспросил на этом форуме, но я просто не могу заставить его работать.Я получаю сообщение об ошибке

    `Error in Ops.data.frame(x, aperm(array(STATS, dims[perm]), order(perm)),  : 
  list of length 206340 not meaningful.`

Я знаю, что этот вопрос несколько повторяется, но другие ответы, которые я нашел, не работают в моей ситуации.Весь мой фрейм данных содержит 57 элементов, поэтому написание кода для разделения каждого столбца по отдельности будет очень длинным.

Заранее благодарен за любые советы.

1 Ответ

0 голосов
/ 04 января 2019

Возможно, что-то вроде этого:

library(tidyverse)

d <- seq(0, 100, 0.5) 
Fe <- runif(201, min = 0, max = 1000) 
Ca <- runif(201, min = 0, max = 1000) 
Zr <- runif(201, min = 0, max = 1000) 
Ti <- runif(201, min = 0, max = 1000) 
Al <- runif(201, min = 0, max = 1000) 
example <- data.frame(d, Fe, Ca, Zr, Ti, Al)
Ratio_Elements <- c("Fe", "Ti", "Zr", "d") #this subset of the 

Example_Ratio <- example %>%
  mutate_at(vars(-Zr), funs(. / Zr)) %>%
  select(Ratio_Elements)

Я знаю, что вы сказали, что хотели бы увидеть решение mutate_all, но, думаю, вы не хотите делить Zr на себя?

В этом случае mutate_at более полезно, в противном случае вы можете сделать mutate_all(funs(. / Zr)).

Если вы хотите сохранить указанный вектор:

Detrital_Divisor <- as.symbol("Zr")

Example_Ratio <- example %>%
  mutate_at(vars(- !! Detrital_Divisor), funs(. / !! Detrital_Divisor)) %>%
  select(Ratio_Elements)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...