【问题标题】:select records from data frame using a range as a variable使用范围作为变量从数据框中选择记录
【发布时间】:2014-10-09 06:53:00
【问题描述】:

我有一个数据框“表”,其中有一列名为“ID”。 “ID”的值从 1 到 100。数据框还有一个名为“weight”的列。

我有一个函数“calc_mean”,它有一个变量来选择“ID”:

calc_mean <- function(id=1:100)

当我调用我的函数时,我希望能够获取这个“ID”的一个子集,例如:

calc_mean(30:35)

在我的函数中编写以下代码时,这必须计算我的列“权重”的平均值:

mean(table$weight[,id])

但我收到以下错误:

[1] 不适用 警告信息: 在 mean.default(table$weight[, id]) 中: 参数不是数字或逻辑:返回 NA

怎么了?

或者,如果我可以将此数据框“table”的一个子集制作成另一个名为“table2”的数据框,其中只有我感兴趣的 ID,我会很高兴。然后我会想到以下代码:

for(i in id){
table2 <- table[table$ID == i,]
}

接着是:

mean(table2$weight)

但是,这给了我错误:

[1] 不适用 警告信息: 在 mean.default(table2$weight) 中: 参数不是数字或逻辑:返回 NA

这里有什么问题?

================================================ ===============================

抱歉,由于某些原因,我想先隐藏我的真实代码,但现在将显示真实代码:

pollutantmean <- function(dummy_dir, pollutant, id = 1:332) {
pollutant <- c("sulfate", "nitrate")
directory <- "C:\\Users\\kieken\\Dropbox\\science\\R programming\\specdata"
setwd(directory)
files <- list.files(directory)
data.list <- lapply(files, read.csv)
data.cat <- do.call(rbind, data.list)
good <- complete.cases(data.cat)
data.clean <- data.cat[good,]

data.ID <- subset(data.clean, ID %in% id)
mean(data.ID[,pollutant])

}
pollutantmean("specdata", "nitrate", 70:72)

这段代码给了我以下错误:

[1] 不适用 警告信息: 在 mean.default(data.ID[, 污染物]) 中: 参数不是数字或逻辑:返回 NA

【问题讨论】:

  • 我注意到你没有发布函数。
  • 请提供一个可重现的例子。如果您不发布我们重现问题所需的内容,则可能无法诊断您的问题。
  • 我删除了以下代码,它现在可以工作了:污染物

标签: r variables dataframe subset


【解决方案1】:

在我的函数中编写以下代码时,这必须计算我的列“权重”的平均值:

mean(table$weight[,id])

这里的逗号没有意义。 table$weight 是一个向量,这意味着它只有一维,而不是二维。因此你应该使用mean(table$weight[id])

for(i in id){ table2 <- table[table$ID == i,] } 

接着是:

mean(table2$weight)

请注意,每次在 for 函数内循环时,都会将 table2 替换为与 table 不同的行。要创建一个子集,您可以使用

table2 <- table[id,]

table2 <- subset(table, ID %in% id)

【讨论】:

  • 我仍然遇到问题:实际上,除了“重量”,我还有一个变量“colum”,我在我的函数中调用它,我定义如下:colum
  • mean(table2[,colum] 与 mean(table2[,c("weight","age")] 相同。您需要决定使用哪一列来计算平均值。此外,我不明白为什么在你的函数中重新定义你的输入(例如目录和污染物),你不应该根据用户给出的输入计算平均值吗?请阅读关于 stackoverflow 问题的说明( stackoverflow.com/help/how-to-ask)
  • 关于目录:我完全糊涂了。似乎他们只想为目录“specdata”提供输入,而这只是目录的最后一部分。但是命令需要有整个路径吗?你们这些人通常是怎么做的?你把你的 R 放在哪个目录下,把你自己的程序放在哪个目录下?如果您想在不同的计算机上工作怎么办?
  • 克里斯,请不要过多地转移话题。显然,您的问题已经解决(并且您没有检查任何答案作为您正在寻找的答案)。我建议您创建另一个问题并详细解释您遇到的问题、您的代码是什么样的以及您尝试了哪些但没有成功。
【解决方案2】:

如果您只想计算“id”子集的平均“权重”,则可以使用with。以下代码计算给定“id”范围内的平均权重

# data example
table <- data.frame(id=1:100, weight=runif(100,60,95))

with(table, mean(weight[id %in% 30:35]))

【讨论】:

  • 但是说 30:35,你硬编码了这个值,而它应该是一个变量......它不应该是 with(table, mean(weight[ID %in% id])) 吗? ??但即使这样也会出错......
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-02-19
  • 1970-01-01
  • 2018-11-11
相关资源
最近更新 更多