2015-09-25 61 views
0

我有一个Data Frame对象,其中包含可能的选项列表。例如,一个这样的比喻是:查找特定选项是否在数据框中R

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

我怎么会......

1)检查是否有一定瞳孔主题组合是我的数据帧

2)并为那些谁在那里,提取他们的等级(和潜在的其他相关领域)

非常感谢

我发现到目前为止,包括追加值设置到数据帧的结束,想看看它是唯一的或不是唯一的解决办法?这似乎是一个粗俗和荒谬的黑客?

+0

如果我理解正确的,你只需要合并的exaple A =合并(A,B,通过。 x = c(“FirstName”,“SurName”,“Subject”),by.y = c(“FirstName”,“SurName”,“Subject”),all.x = T) – Batanichek

+0

也许你想子集数据?看看'?subset'和'?'[。data.frame'' –

+0

哇,这些对于这个问题来说似乎是不必要的复杂。感谢您的帮助! – Henry

回答

1

我认为你正在寻找这样的:

result <- data[data$FirstName == "Brian" & data$Subject == "History", c("Grade") ] 
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) 
+0

感谢您的指针 - 现在就试用它。 – Henry

+0

感谢您使用Aggregate的提示。我上面的例子是我想要做的大量简化,我怀疑在我的确切情况下可能没有帮助。我所拥有的实际上是为用户提供的所有可用选项的数据框+用于将标签映射为有用数字的关键字,我只想检查用户提供的选项是否在可能的范围内。 – Henry

+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其中FirstName是它Brianall列。

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") 
+0

谢谢。我已经完成了大部分工作,但是我试图去解决后者 - 如何根据多个条件构建一张支票。在我的情况下,我想匹配3个条件并返回查找的多个输出。 非常感谢您的帮助。 – Henry

+0

我试过实现这一点,我得到的错误:'错误在df $ VARNAME:'关闭'类型的对象不是子集' 当使用函数调用时: 'valid <-optsdf [df $ VAR1 == input_variable&df $ VAR2 == input_variable2&df $ VAR3 == input_variable3,1]' – Henry

+0

什么是optsdf这里。你可以使用它的行和列对一个'df'进行子集化。它应该是'有效的'-df [df $ VAR1 == input_variable&df $ VAR2 == input_variable2&df $ VAR3 == input_variable3,1]' –