2015-04-04 60 views
1

剛剛在這裏創建了一個帳戶,因爲我最終有一個值得問的問題。我對R(1年,開關用戶)很新,但通常能夠在線直到現在能夠在線找到我的R問題的答案。我的問題有些令人費解,所以我會盡量做到儘可能清楚。道歉,如果我的術語不重要。在argtype和argaction函數中循環

我有一個數據框有兩列,一箇舊的ID號和兩個保護功能名稱。例如:

> df = 
> code attr 
> 1  FSM Oceanic atoll 
> 3  FSM Oceanic bank 
> 1  Palau Oceanic atoll 
> 3  Palau Oceanic bank 

正如您所看到的,這些功能是獨一無二的,但不是舊的編碼系統。我需要用新的唯一ID代碼創建一個新列。對於如:

> df = 
> code attr     new.code 
> 1  FSM Oceanic atoll  1 
> 3  FSM Oceanic Bank  2 
> 1  Palau Oceanic atoll 3 
> 3  Palau Oceanic Bank 4 

我找到了一種方法,從先前的問題做到這一點:

> newCodes <- function(argtype, argaction){ 
> if (argtype==1 & argaction=="FSM Oceanic atoll") 
>  return(1) 
> if (argtype==3 & argaction=="FSM Oceanic Bank") 
>  return(2) 
> if (argtype==1 & argaction=="Palau Oceanic atoll") 
>  return(3) 
> if (argtype==3 & argaction=="Palau Oceanic Bank") 
>  return(4) 
> } # Defines my function 
> 
> df$new.code <- mapply(newCodes, df$code, df$attr) # Creates the new conditional column 

它需要做的這種方式是因爲我原來的數據框具有相同的許多重複條目的原因「獨特的功能」,需要維護我的目的(它本質上是一個shapefile的屬性表,因此重複的條目)。

上面的函數代碼在我只有幾個特性(如10)時很棒,但是在某些時候我需要爲具有多達185個獨特特性的表執行此操作。我想知道是否可以循環上面的函數,這樣我就不必爲每個特性手動輸出個別的「argtypes」和「argactions」了?我覺得可能有一種方法可以根據我得到的初始數據幀框架(也就是我給出的第一個數據框)進行循環。我不知道它會是什麼樣子的代碼是什麼,而且意味着沿着線的東西:

> if (argtype == [loop: through each old code number row by row in the initial "code" 
> column in 1st df] & argaction == [loop: through each corresponding attribute name row 
> by row in the initial "attr" column in 1st df]) 
> return([loop: just loop through each row value of a df with the new code IDs, 
> which would be just 1 to x, x being number of new ID codes needed]) 

真希望我的意思是明確的。感謝您的任何建議。

+0

你是什麼意思的「兩個保護功能」?如果你有重複的行,會發生什麼情況?相同的new.code值?對於沒有複製的每對情侶(代碼,attr),你想要一個唯一的新代碼值,對嗎? – 2015-04-04 07:05:34

+0

對不起,我的標點符號不清楚 - 我只是解釋了第一個有兩列的數據框,一列是舊ID號,第二列是保護功能(即我想保存的感興趣的棲息地特徵)。 ..是的,如果我有任何重複的行(如我在這裏給出的第一個數據框示例),我希望new.code的值是相同的;他們應該匹配。是的,對於每個不重複的代碼/屬性對,我想要一個獨特的新代碼值。謝謝@ColonelBeauvel – jessc 2015-04-06 01:19:30

回答

0
transform(df, new.code=as.numeric(factor(attr))) 

這給出了attr數字中的每一個唯一的詞,編號是按字母順序排列的。它使用的事實是,如果你將一個因子轉換成一個數字,它會給你一個整數,指出該因子的等級。我希望這有幫助。 乾杯

+0

是否可以包含舊的代碼列,以便分配唯一條件?我需要新的代碼值來表示舊代碼和attr列的唯一組合。非常感謝您的時間和幫助,歡呼聲 – jessc 2015-04-06 01:26:52

+0

'df,new.code = as.numeric(factor(paste(code,attr))))' 新的粘貼部分創建一個由數字和名字。因此你可以得到所有獨特組合的結果。我希望這有幫助。 – user3239929 2015-04-21 15:03:55