2016-07-19 2 views
1

Я пытаюсь выбрать столбцы из строковых переменных и выполнить предварительные вычисления.
выбор столбца из строковых переменных с использованием dplyr

Предположим, что я анализирую iris и хочу найти все отношения между длинами и ширинами.

# Manual mutation (ie: adding the column names explicitly in the mutate statement) 
iris %>% 
    mutate(Sepal.ratio = Sepal.Length/Sepal.Width, 
     Petal.ratio = Petal.Length/Petal.Width) 

# Output: 
# Sepal.Length Sepal.Width Petal.Length Petal.Width Species Sepal.ratio Petal.ratio 
# 1   5.1   3.5   1.4   0.2 setosa 1.457143  7.00 
# 2   4.9   3.0   1.4   0.2 setosa 1.633333  7.00 
# 3   4.7   3.2   1.3   0.2 setosa 1.468750  6.50 
# 4   4.6   3.1   1.5   0.2 setosa 1.483871  7.50 
# 5   5.0   3.6   1.4   0.2 setosa 1.388889  7.00 
# 6   5.4   3.9   1.7   0.4 setosa 1.384615  4.25 


Вопрос: Есть ли способ, чтобы использовать переменную или dataframe (подобно ratioSets определено ниже), который определяет имена столбцов?

# Predefined or preprocessed column name set: 
ratioSets = rbind(c(value = 'Sepal.ratio', numerator = 'Sepal.Length', denominator = 'Sepal.Width'), 
       c(value = 'Petal.ratio', numerator = 'Petal.Length', denominator = 'Petal.Width')) 

# Automated mutation: 
iris %>% 
    mutate(
    # How can I use the ratioSets here? 
    # Something like : ratioSets$value = ratioSets$numerator/ratioSets$denominator 
) 


# Expected Output: 
# Sepal.Length Sepal.Width Petal.Length Petal.Width Species Sepal.ratio Petal.ratio 
# 1   5.1   3.5   1.4   0.2 setosa 1.457143  7.00 
# 2   4.9   3.0   1.4   0.2 setosa 1.633333  7.00 
# 3   4.7   3.2   1.3   0.2 setosa 1.468750  6.50 
# 4   4.6   3.1   1.5   0.2 setosa 1.483871  7.50 
# 5   5.0   3.6   1.4   0.2 setosa 1.388889  7.00 
# 6   5.4   3.9   1.7   0.4 setosa 1.384615  4.25 
+0

Я не понимаю, что вы хотите. Можете ли вы включить пару строк вашего предполагаемого вывода? – Maiasaura

+0

@Maiasaura Я добавил некоторое дополнительное объяснение к вопросу. Пожалуйста, дайте мне знать, если это еще не ясно. – Deena

+0

Идеально, имеет смысл сейчас. Это немного сложнее в 'dplyr', но я об этом думаю. – Maiasaura

ответ

1

Один из способов, который предполагает, что числитель всегда перед знаменателю (т.е.. Длина до того ширина)

sapply(unique(sub('\\..*', '', names(iris[,-ncol(iris)]))), function(i) 
     Reduce('/', iris[,-ncol(iris)][,grepl(i, sub('\\..*', '', names(iris[,-ncol(iris)])))])) 

или

head(cbind(iris, sapply(unique(sub('\\..*', '', names(iris[,-ncol(iris)]))), 
     function(i) Reduce('/', iris[,-ncol(iris)][,grepl(i, sub('\\..*', '', names(iris[,-ncol(iris)])))])))) 

# Sepal.Length Sepal.Width Petal.Length Petal.Width Species Sepal Petal 
#1   5.1   3.5   1.4   0.2 setosa 1.457143 7.00 
#2   4.9   3.0   1.4   0.2 setosa 1.633333 7.00 
#3   4.7   3.2   1.3   0.2 setosa 1.468750 6.50 
#4   4.6   3.1   1.5   0.2 setosa 1.483871 7.50 
#5   5.0   3.6   1.4   0.2 setosa 1.388889 7.00 
#6   5.4   3.9   1.7   0.4 setosa 1.384615 4.25 
+0

Спасибо @ Сото. Знаете ли вы, есть ли способ сделать это через 'mutut'' dplyr''? – Deena

+0

Я уверен, что есть. Было бы хорошим упражнением перевести мой код в 'dplyr' :) – Sotos

+0

На самом деле главной задачей, с которой я столкнулся, является передача переменной colname через dplyr. Поэтому, если в примере я задал некоторые значения, которые я не мог правильно проиндексировать через dplyr. – Deena

Смежные вопросы