查找特定选项是否在数据框R中

时间:2015-09-25 11:04:34

标签: r

我有一个Data Frame对象,其中包含可能的选择列表。例如,这类似于:

FirstName, SurName, Subject, Grade
Brian, Smith, History, 75
Jenny, Jackson, English, 60

我怎么......

1)检查我的数据框中是否有某个学生 - 主题组合

2)对于那些在那里的人,提取他们的成绩(以及可能的其他相关领域)

非常感谢

我到目前为止找到的唯一解决方案包括将值附加到数据框的末尾并尝试查看它是否唯一?这似乎是一个粗暴而荒谬的黑客攻击?

3 个答案:

答案 0 :(得分:2)

使用base R。

学习数据子集(提取)

要按行和列对任何数据框进行子集,请使用[ ]

df成为您的数据框。

  FirstName  SurName  Subject Grade
1     Brian    Smith  History    75
2     Jenny  Jackson  English    60
3       Tom  Brandon  Physics    50

您可以使用

按行和列对其进行子集化
df[rows,columns]

此处rowscolumn可以是:

1)索引(编号/名称)

这意味着为我提供特定行和列的子集,如

df[2,3]

这将返回第二行和第三列

[1]  English

df[2,"Grade"]

返回

[1] 60

2)范围(指数/名称列表)

这意味着为我提供这些行和列的子集,如

df[1:2,2,drop=F]

这里drop=F可以避免像data.frame那样扁平化结果和输出。它会给你这个

   SurName
1    Smith
2  Jackson

范围也支持all,将行或列留空,如

df[,3,drop=F]

这将返回all

third column
   Subject
1  History
2  English
3  Physics

df[1:2,c("Grade","Subject")]

  Grade  Subject
1    75  History
2    60  English

3)逻辑

这意味着您希望使用逻辑条件进行子集化。

df[df$FirstName=="Brian",]

意思是给我rows其中FirstNameBrianall列。

  FirstName SurName  Subject Grade
1     Brian   Smith  History    75

df[df$FirstName=="Brian",1:3]

给我FirstNameBrian的行,并且只给我1到3列。

或创建复杂的逻辑

df[df$FirstName=="Brian" & df$SurName==" Smith",1:3]

输出

  FirstName SurName  Subject
1     Brian   Smith  History

或复杂的逻辑和按名称提取列

df[df$FirstName=="Brian" & df$SurName==" Smith","Grade",drop=F]

  Grade
1    75

或复杂的逻辑,并按名称提取多个列

df[df$FirstName=="Brian" & df$SurName==" Smith",c("Grade","Subject")]

  Grade  Subject
1    75  History

在函数中使用它

myfunc<-function(input_var1,input_var2,input_var3) 
{ 
    df[df$FirstName==input_var1 & df$SurName==input_var2 & df$Subject==input_var3,"Grade",drop=F]
}

像这样运行

myfunc("Tom","Brandon","Physics")

答案 1 :(得分:1)

尝试subset

con <- textConnection("FirstName,SurName,Subject,Grade\nBrian,Smith,History,75\nJenny,Jackson,English,60")
dat <- read.csv(con, stringsAsFactors=FALSE)
subset(dat, FirstName=="Brian" & SurName=="Smith" & Subject=="History", Grade)

也许aggregate也可以提供帮助。以下代码给出了所有学生/科目组合的成绩平均值:

dat <- transform(dat, FullName=paste(FirstName, SurName), stringsAsFactors=FALSE)
aggregate(Grade ~ FullName+Subject, data=dat, FUN=mean)

答案 2 :(得分:1)

我认为你正在寻找这个:

result <- data[data$FirstName == "Brian" & data$Subject == "History", c("Grade") ]