根据数据框中的列为字符串分配数字

时间:2015-07-19 00:24:28

标签: r performance indexing dataframe

我有点初学者的问题。它与效率和使用较少的代码行有关。 (我计划在大学主修计算机科学,我认为在编码方面做得更好会很好!)我有一个包含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
}

正如您所看到的,我在for循环中有3个if语句,以找出赋予函数的变量。因为我有3个if语句,所以我觉得有一种更有效的方法可以做到这一点。我的想法就像分配var1,var2和var3一些数字然后做同样的事情。但是我不知道如何处理这个问题!

2 个答案:

答案 0 :(得分:1)

如果您想按(字符串)变量名称查找数据框列,请选择该列的minwhich.min(并且您不需要for循环:与大多数R函数一样,minwhich.min被矢量化:

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

如果您想通过列索引引用它,请像Matt O&#39; Brien show一样使用apply

答案 1 :(得分: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