【问题标题】:assigning strings a number based on its column in a data frame根据数据框中的列为字符串分配一个数字
【发布时间】:2015-10-08 09:58:37
【问题描述】:

我有一个初学者的问题。它与效率和使用更少的代码行有关。 (我计划在大学主修计算机科学,我认为在编码方面做得更好会很好!)我有一个包含 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 分配一些数字,然后做同样的事情。但是我不知道如何解决这个问题!

【问题讨论】:

  • 请发布一个可重现的示例(生成数据的代码,可能使用随机)
  • 使用字符串查找列称为列索引(按名称)

标签: r performance indexing dataframe


【解决方案1】:

如果您想通过(字符串)变量名称查找数据框列,则使用该列的 minwhich.min(并且您不需要 for 循环:min 和 @987654324 @ 是矢量化的,就像大多数 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,就像 Matt O'Brien 展示的那样。

【讨论】:

  • ...这个 MikeOBrien 是谁? ;)
  • ``yourvar= 'var2'` 只是一些虚构的变量,以说明我们可以使用字符串作为 df 中的列索引。对不起,我把你的名字弄错了。
  • 谢谢!我很高兴还有一个 min 函数。让生活更轻松。
  • 对。您永远不需要编写 for 循环来在向量上执行函数。 R 中的大多数函数都是向量化的,对于少数不是向量化的函数,请使用 sapply/apply。永远不要使用 for 循环。
【解决方案2】:

你想要这样的东西吗?

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 

【讨论】:

    猜你喜欢
    • 2021-07-12
    • 2021-04-17
    • 2021-09-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多