如何在数据集中附加一个额外的列,并在R中为它们提供字符串值?

时间:2014-10-07 14:32:31

标签: r statistics dataset

数据集可在此处找到:https://www.dropbox.com/s/l7pc11hhiwr8zzn/data.csv?dl=0或MASS库中的“nlschools”。

在这个数据集中,我想添加一个名为SEScat的额外列,它将SES列中的值索引为低(&lt; = 30),med(30 40)。在我的想象中,命令可能看起来像这样: > nlschools$SEScat <- (pseudo: low if SES <=30, med if 30 < SES <=40, high if SES > 40),但我无法找到合适的语法,文档似乎依赖于比我更多的背景知识。

然而,在此之前,我必须制作一个额外的专栏。使用names(nlschools) <- c("lang","IQ","class","GS","SES","COMB","SEScat")不起作用,因为name属性的长度不够。我不确定如何增加它。

这个问题来自我之前提出的问题,但我认为其他用户将其作为一个单独的问题可能会很方便。我希望没关系。

2 个答案:

答案 0 :(得分:0)

这样做的直接方法是循环遍历SES列中的每个单独值(使用for循环)并测试每个值是否适合您的类别(低,中和高)。您可以使用if和else语句来完成此操作。然后将结果写入新创建的列$ SEScat的当前行。

# load data
a <-read.csv('data.csv')

# loop through individual SES values
for (i in a$SES)
{
  # check for low 
  if (i <= 30)
  {

  # write to new column
  a$SEScat = 'low'

  # check for mid
  } else if (i > 30 && i <= 40)
  {

  # write to new column
  a$SEScat = 'mid'

  # check for high
  } else 
  {

  # write to new column
  a$SEScat = 'high'
}
}

# display data frame
View(a)    

答案 1 :(得分:0)

尝试:

> ddf$SEScat = with(ddf, ifelse(SES<=30,'low', ifelse(SES<=40, 'med', 'high')))
> head(ddf)
  X lang   IQ class GS SES COMB SEScat
1 1   46 15.0   180 29  23    0    low
2 2   45 14.5   180 29  10    0    low
3 3   33  9.5   180 29  15    0    low
4 4   46 11.0   180 29  23    0    low
5 5   20  8.0   180 29  10    0    low
6 6   30  9.5   180 29  10    0    low
> 

可以拆分,如下所示:How do I subset/split this table bases on the values of one column in R?