2014-04-09 19 views
1

我有一個數據幀,如下通過比較2列中的值來拆分R中的數據框?

ID1 ID2 INT 
aaa qqq 1 
aaa ccc 2 
aaa nnn 1 
aaa yyy 1 
bbb nnn 3 
bbb aaa 4** 
ccc ddd 3 
ddd bbb 1*** 
ppp yyy 2 
ppp ccc 1 
mmm bbb 1*** 
mmm ppp 2 
nnn ccc 2 

我希望將數據分割成新的數據幀,如下所示,其中,如下所示任一或ID1 ID2的ID的任何發生分組?

For aaa  
ID1  ID2 INT 
aaa  qqq 1 
aaa  ccc 2 
aaa  nnn 1 
aaa  yyy 1 
aaa  bbb 4** 

在該數據幀中的第4行是在ID2爲「AAA」

For bbb  
ID1 ID2 INT 
bbb nnn 3 
bbb aaa 4 
bbb ddd 3*** 
bbb mmm 2*** 

我怎麼能做到這一點R中的原始數據的第6行?

回答

0

讀取數據。例如:

df <- read.table(text="ID1 ID2 INT 
aaa qqq 1 
aaa ccc 2 
aaa nnn 1 
aaa yyy 1 
bbb nnn 3 
bbb aaa 4 
ccc ddd 3 
ddd bbb 1 
ppp yyy 2 
ppp ccc 1 
mmm bbb 1 
mmm ppp 2 
nnn ccc 2", header=TRUE) 

熔體df爲長格式和同時放創建結合了ID1ID2值與reshape2包一個新的變量:

require(reshape2) 
df2 <- melt(df, id=c("ID1", "ID2","INT"), measure=c("ID1", "ID2"), variable = "ID") 

分割數據幀中數據幀列表:

dfs2 <- split(df2, df2$value) 

選擇列表中的特定數據框用的這兩種可能性之一:

dfs2$aaa 
dfs2[[aaa]] 

創建單獨的dataframes:

list2env(split(df2, df2$value), envir = .GlobalEnv) 

保存每個數據幀列表中的一個單獨的文件:

lapply(seq_along(dfs2), function(i) write.csv(dfs2[i], file = paste0(names(dfs2)[i],'.csv'))) 
+0

拆分有助於拆分基於列ID1的數據,我已經改寫了這個問題,有沒有辦法在ID1或ID2中出現元素以獲取上述列表的方式? – user3509031

+0

查看我的更新回答 – Jaap

+0

如果答案適合您,通常您會接受答案(和/或給出答案upvote)。這將爲未來的讀者提供解決方案價值的線索。另見本幫助頁面:[當某人回答我的問題時,我應該怎麼做?](http://stackoverflow.com/help/someone-answers) – Jaap

0

從問題中不清楚你究竟想做什麼!正則表達式或grep可能是你的朋友在這裏

grep('a b', c('cc', 'c a b c', '123')) 
>2 

有沒有一種模式可以搜索?

+0

我沒有清楚地說明問題的格式,這是我的第一篇文章。我需要一個大數據框! – user3509031

+1

使用子集?例如new.data.frame = subset(data.frame,ID1 =='aaa')有多大是多大 – user3472874

+0

大在這裏會超過10000行!並且在使用子集子集(data.frame,ID1 =='aaa')時,我只得到ID1 ==「aaa」但不是ID2 ==「aaa」的行。如果您看到最終結果,則在aaa(aaa bbb 4)的數據框爲第4行的情況下,ID1和ID2反轉,因爲它是數據中的第6行(bbb aaa 4)。 – user3509031