2015-07-19 61 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 
相关问题