2016-08-01 46 views
2

我有幾個數據集,由不同地區的350-600個農戶之間的約250個變量組成。數據非常混亂,並提出了許多分析問題。我是R新手,所以對下面的任何幫助將不勝感激。如何遍歷數據框中的列子集以創建新變量

最初,幾個列包含多個變量,例如,一個包含至多4單獨輸入(肥料,除草劑,殺蟲劑和混合種子)的「輸入」欄。我使用tidyr中的spread()函數創建4個新變量(Input_1 ... Input_4)。產生的,新的「輸入」變量如下所示模擬數據幀,其中每一行代表一個農戶:

Input_1 <- c("Fertilisers", "Fertilisers", "Fertilisers", "Fertilisers", NA) 
Input_2 <- c("Hybrid_Seeds", "Hybrid_Seeds", "Pesticides", "Herbicides", NA) 
Input_3 <- c(NA, NA, NA, "Pesticides", NA) 
Input_4 <- c(NA, NA, NA, "Hybrid_Seeds", NA) 

x <- data.frame(Input_1, Input_2, Input_3, Input_4) 

x 

     Input_1  Input_2 Input_3  Input_4 
1 Fertilisers Hybrid_Seeds  <NA>   <NA> 
2 Fertilisers Hybrid_Seeds  <NA>   <NA> 
3 Fertilisers Pesticides  <NA>   <NA> 
4 Fertilisers Herbicides Pesticides Hybrid_Seeds 
5  <NA>   <NA>  <NA>   <NA> 

我希望做通這些新產生的「輸入的是環「列中,搜索匹配的輸入(例如」肥料「或」農藥「),並將結果以」是/否「格式輸入到新變量中,輸入數據集中的4種類型輸入(Fertilizers,Pesticides ,除草劑和混合種子)。換句話說,從環路上x上述結果會產生以下幾列新創建的「是/否」變量:

Fertilisers <- c("Yes", "Yes", "Yes", "Yes", "No") 
Herbicides <- c("No", "No", "No", "Yes", "No") 
Pesticides <- c("No", "No", "Yes", "Yes", "No") 
Hybrid_Seeds <- c("Yes", "Yes", "No", "Yes", "No") 

x2 <- data.frame(Fertilisers, Herbicides, Pesticides, Hybrid_Seeds) 

x2 

    Fertilisers Herbicides Pesticides Hybrid_Seeds 
1   Yes   No   No   Yes 
2   Yes   No   No   Yes 
3   Yes   No  Yes   No 
4   Yes  Yes  Yes   Yes 
5   No   No   No   No 

它可能會更容易顯現,我想什麼,當數據幀xx2合併成一個時:

x3 <- data.frame(x, x2) 

x3 

     Input_1  Input_2 Input_3  Input_4 Fertilisers Herbicides 
1 Fertilisers Hybrid_Seeds  <NA>   <NA>   Yes   No 
2 Fertilisers Hybrid_Seeds  <NA>   <NA>   Yes   No 
3 Fertilisers Pesticides  <NA>   <NA>   Yes   No 
4 Fertilisers Herbicides Pesticides Hybrid_Seeds   Yes  Yes 
5  <NA>   <NA>  <NA>   <NA>   No   No 
    Pesticides Hybrid_Seeds 
1   No   Yes 
2   No   Yes 
3  Yes   No 
4  Yes   Yes 
5   No   No 

的4個輸入按照一定的順序,即肥料將始終是第一(INPUT_1)如果該家庭使用肥料,除草劑會INPUT_2如果它們同時使用肥料和除草劑(如果他們使用肥料和農藥但不使用除草劑,然後使用Pestic IDE將是Input_2等。如果家庭使用全部4個輸入,它們將按以下順序出現(參見上面的第4行):肥料,除草劑,殺蟲劑,混合種子。

我試圖創建for循環來遍歷所有4個輸入變量,尋找匹配的字符串,並在關聯的新輸入變量中輸入「是」(例如,如果匹配「Fertilizers」 「可以在4個現有的」輸入「變量中找到),但是我沒有取得太大的成功。

看起來好像沒有apply家庭解決方案,但我很樂意被糾正。再說一遍,我對R和編程一般都很陌生,所以任何幫助都將不勝感激。我對for循環確實有非常有限的經驗,但這個問題對我來說已經證明過於複雜,解決這個問題非常關鍵,因爲這是我在研究中前進的主要障礙。

非常感謝。

回答

1

我們可以使用table

tbl <- table(row(x), as.character(unlist(x))) 

最好是把它作爲一個二進制輸出,而不是更改爲「是/否」,但如果我們需要再轉換

tbl[] <- c("No", "Yes")[tbl+1] 

和這可以轉換爲data.frame

as.data.frame.matrix(tbl) 
# Fertilisers Herbicides Hybrid_Seeds Pesticides 
#1   Yes   No   Yes   No 
#2   Yes   No   Yes   No 
#3   Yes   No   No  Yes 
#4   Yes  Yes   Yes  Yes 
#5   No   No   No   No 
相關問題