2015-07-19 66 views
0

我有一些初學者問題。它與效率和使用較少的代碼行有關。 (我計劃在大學裏主修計算機科學,我認爲在編碼方面做得更好!)我有一個包含45個變量和1000多個觀察值的數據集,但是我需要操縱3個變量並找到最低值每個這些列。例如,我在第11列有變量1(稱爲「var1」),第17列有變量2(「var2」),第23列有變量3(「var3」)。我有一個函數,將一個字符串作爲參數(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個if語句內的for循環找出是考慮到該函數的變量是什麼。因爲我有3條if語句,所以我覺得有一個更有效的方法可以做到這一點。我的想法就像分配var1,var2和var3某個數字然後做同樣的事情。但是我不知道如何解決這個問題!

+0

請發佈一個可重現的例子(代碼來生成您的數據,可能使用隨機) – smci

+0

使用字符串來查找列被稱爲***列索引(按名稱)*** – smci

回答

1

如果你想查找由(串)變量名數據幀列,然後採取min或該列的which.min(你並不需要一個for循環:minwhich.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

爲什麼=符號? –

+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 
相關問題