R基于原子矢量数据将列添加到数据帧

时间:2016-10-18 18:53:48

标签: r dataframe

我正在尝试在我的数据框中添加一个名为Solvent的列,并根据溶剂利用率返回yes或no,我已经成功添加了另一个获取县数据的列但我的溶剂代码不工作。我收到错误:“SCC $ SCC.Level.One中的错误:$运算符对原子向量无效”

    NEI <- readRDS("summarySCC_PM25.rds")
SCC <- readRDS("Source_Classification_Code.rds")

library(ggplot2)


form <- NEI[,c("fips","SCC", "Emissions")]
LANEI <- form[form$fips=="06037",]
OCNEI <- form[form$fips == "06059",]
SBCNEI <- form[form$fips =="06071",]

AllNEI<-rbind(rbind(LANEI,OCNEI), SBCNEI)

GetCounty <-function (fips)
{
  if (fips == "06037")
    return ("Los Angeles")
  else if (fips == "06059")
    return ("Orange County")
  if (fips == "06071")
    return ("San Bernardino County")

}
chckSolv <- function (SCC)
{

   if ( SCC$SCC.Level.One == "Solvent Utilization")
    return ("Yes")
  else
    return ("No")
}


CountyData <- sapply(AllNEI$fips, GetCounty)
solventData <- sapply(AllNEI$SCC,chckSolv)
AllNEI <-cbind (AllNEI, Solvent = solventData)
AllNEI <- cbind(AllNEI, county = CountyData)

2 个答案:

答案 0 :(得分:1)

问题似乎是您使用SCC作为函数chckSolv的参数名称,但之后使用它来尝试引用全局定义的SCC数据框你的脚本。您的函数不会使用全局定义的版本(因为名称SCC是在您的函数中本地定义的)

如果将参数更改为其他名称,则应该有效。尝试这样的事情:

chckSolv <- function (vec)
{

   if ( vec == "Solvent Utilization")
     return ("Yes")
   else
     return ("No")
}

答案 1 :(得分:1)

考虑使用矢量化ifelse()。您之前的错误是由于引用了特定值SCC.Level.On上的命名元素SCC

AllNEI$CountyData <- ifelse(AllNEI$fips == "06037", "Los Angeles",
                            ifelse(AllNEI$fips == "06059", "Orange County", 
                                   ifelse(AllNEIfips == "06071", "San Bernardino County", NA)

AllNEI$SolventData <- ifelse(AllNEI$SCC == "Solvent Utilization", "Yes", "No")

此外,您可以减少rbind操作:

AllNEI <- NEI[NEI$fips %in% c("06037", "06059", "06071"), c("fips", "SCC", "Emissions")]