2015-07-19 4 views
0

У меня есть начальный вопрос. Это связано с эффективностью и использованием меньших строк кода. (Я планирую специализацию в области компьютерных наук в колледже, и я понял, что лучше кодировать было бы хорошо!) У меня есть набор данных с 45 переменными и 1000+ наблюдениями, но мне нужно манипулировать 3 переменными и найти самое низкое значение в каждой из этих столбцов.присвоение строк числу на основе его столбца в фрейме данных

Например, у меня есть переменная 1 (назовите ее «var1») в столбце 11, переменной 2 («var2») в столбце 17 и переменной 3 («var3») в столбце 23. У меня есть функция, которая принимает строку в качестве аргумента (var1, var2 или var3), переходит в этот столбец в наборе данных и проходит через него и ищет самое низкое значение.

В настоящее время мой код выглядит довольно неэффективно:

whichLowest <- function(variable) { 
# Function has some read.csv things and other pre-computational stuff here 
    if (variable == "var1") 
    varData <- subset(myDataset, select = colnames(stateData)[11]) 
    else if (variable == "var2") 
    varData <- subset(myDataset, select = colnames(stateData)[17]) 
    else if (variable == "var3") 
    varData <- subset(myDataset, select = colnames(stateData)[23]) 
    else 
    stop("invalid outcome") 
for (i in varData) { 
# calculates lowest value in that column 
} 

Как вы можете видеть, у меня есть 3, если заявления внутри для цикла, чтобы выяснить, что переменная, которая дается функцией. Поскольку у меня есть 3 if-утверждения, я чувствую, что есть более эффективный способ сделать это. Моя мысль - это что-то вроде назначения var1, var2 и var3 некоторого числа, а затем выполнения того же самого. Однако я не знаю, как подойти к этому!

+0

Просьба представить воспроизводимый пример (код для генерации ваших данных, возможно, с использованием случайных данных) – smci

+0

Использование строки для поиска столбца называется индексированием столбцов *** (по имени) *** – smci

ответ

1

Если вы хотите посмотреть столбец dataframe по (строке) имя переменного, а затем взять min или which.min этот столбец (и вам не нужен для цикла: min и which.min являются векторизованными, как и большинство функций R):

set.seed(103) 
df = data.frame(var1 = sample(1:20, 10), var2 = sample(1:20, 10), var3 = sample(1:20, 10)) 

# var1 var2 var3 
#  5 10 4 
#  2 6 11 
# 10 15 10 
#  9 18 18 
# 19 17 9 
# 16 2 14 
#  7 16 15 
#  3 4 13 
#  1 5 5 
#  4 13 17 

min(df[,'var2']) 
# 2 

yourvar = 'var1' 
min(df[,yourvar]) 
# 1 

yourvar = 'var2' 
min(df[,yourvar]) 
# 2 

yourvar = 'var3' 
min(df[,yourvar]) 
# 4 

Если вы хотите, чтобы ссылаться на него на колонке индекса используйте apply как показывает Мэтт О'Брайен.

+0

почему the = sign? –

+0

... и кто этот парень MikeOBrien? ;) –

+0

'' yourvar = 'var2'' - это просто какая-то измененная переменная, чтобы проиллюстрировать точку, в которой мы можем использовать строку в качестве индекса столбца в df. Извините, я получил ваше имя неправильно. – smci

0

Вы хотите что-то вроде этого?

df <- data.frame(Var1=c(1,2,3), Var2=c(2,3,4), Var11=c(9,10,11)) 

apply(df, 2, min) 
#Var1 Var2 Var11 
# 1  2  9 
Смежные вопросы