我有一个Data Frame
对象,其中包含可能的选择列表。例如,这类似于:
FirstName, SurName, Subject, Grade
Brian, Smith, History, 75
Jenny, Jackson, English, 60
我怎么......
1)检查我的数据框中是否有某个学生 - 主题组合
2)对于那些在那里的人,提取他们的成绩(以及可能的其他相关领域)
非常感谢
我到目前为止找到的唯一解决方案包括将值附加到数据框的末尾并尝试查看它是否唯一?这似乎是一个粗暴而荒谬的黑客攻击?
答案 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]
此处rows
和column
可以是:
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
其中FirstName
为Brian
和all
列。
FirstName SurName Subject Grade
1 Brian Smith History 75
或
df[df$FirstName=="Brian",1:3]
给我FirstName
为Brian
的行,并且只给我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") ]