2015-09-25 36 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]' –

相關問題