2012-11-24 15 views
3

可能重複:
Assigning values to a df$column based on another column in the same df添加在R數據幀中的新列的值有條件的另一列的值

假設我有數據幀:

table<- data.frame(population=c(100, 300, 5000, 2000, 900, 2500), habitat=c(1,2,3,4,5,6)) 

現在我想添加一個新的列表$ size,其值爲1如果人口< 500,2 if 500 < =人口< 1000,3,如果1000 < =人口< 2000年4如果2000 < =人口< 3000,5,如果3000 < =人口< = 5000

我只知道如何與二進制TRUE創建列/ FALSE結果取決於另一列中的值,例如

table$size <- (table$population<1000) 

但我不確定要做到這一點,以獲得不同的條件不同的數字。任何人都可以提供幫助嗎?

+0

請格式化您的問題。 –

回答

9

首先不叫data.frametable,因爲table是基本功能。

您可以使用findInterval

df <- data.frame(population=c(100, 300, 5000, 2000, 900, 2500), 
       habitat=c(1,2,3,4,5,6)) 
v <- c(-Inf,500,1000,2000,3000,5000) 
df$size <- findInterval(df$population,v,all.inside = TRUE) 
    population habitat size 
1  100  1 1 
2  300  2 1 
3  5000  3 5 
4  2000  4 4 
5  900  5 2 
6  2500  6 4 

我用all.inside = TRUE因爲你想定義爲5000尺寸5,我認爲值不能大於。如果可以的話,你可以使用類似

v <- c(-Inf,500,1000,2000,3000,5001,Inf)

+0

+1:我認爲'findInterval()'總是比'cut()'更加整潔,因爲這些問題。儘管如此,我不認爲通過調用數據框「table」來覆蓋基函數table()(換句話說,您仍然可以使用table()函數)但是調用數據框「table」確實會導致R的用戶分心。 – A5C1D2H2I1M1N2O1R2T1

+0

作爲我之前評論的後續內容,這是一個很好的問答:http://stackoverflow.com/q/6135868/1270695 – A5C1D2H2I1M1N2O1R2T1

+0

您是正確的,但這是一個滑坡。如果爲數據對象使用基本函數名稱,那麼將它們用於用戶定義的函數只是一小步。 – Roland

4

您可以爲您的映射定義一個函數。因此,包括您不同的垃圾桶:

mysize <- function(x){ 
    if(x<500) 
    return(1) 
    if(500 <= x & x < 1000) 
    return(2) 
    if(1000<=x & x<2000) 
    return(3) 
    if(2000<=x & x<3000) 
    return(4) 
    if(3000<=x & x <=5000) 
    return(5) 
    else 
    return(NA) 
} 

那麼你可以申請此功能,你的人口列,並添加所需的新列:

table$population.bin <- sapply(table$population, mysize) 
table 
+0

這就是我正在尋找的。謝謝。 – econlearner

+2

對於較大的數據集,這只是很醜而且很可能很慢。你至少應該使用'vectorelse',這是矢量化的。 – Roland

+0

我同意你的解決方案更好。直到現在還不知道findInterval函數。 – kku

2

,只要你能對付5的是任意數量< 5001而不是< = 5000,你可能只是想要標籤的剪切功能。所有的

# look at the help window 
?cut 

# initiate your table 
table <- 
    data.frame(
     population = c(100 , 300, 5000, 2000, 900, 2500) , 
     habitat = 1:6 
    ) 

# create a new column with the desired cutpoints 
table$size <- 
    cut( 
     # input data 
     table$population , 
     # cut points 
     c(-Inf , 500 , 1000 , 2000 , 3000 , 5001) , 
     # label values (character strings work too) 
     labels = 1:5 , 
     # interval closed on the right? 
     right = FALSE 
    ) 
相關問題