3

可能重复:
根据同一 df 中的另一列将值分配给 df$column

假设我有数据框:

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

现在我想添加一个新的列 table$size,其值为 1 如果人口 < 500、2 如果 500<=人口<1000、3 如果 1000<=人口<2000、4 如果 2000<=人口<3000、5 如果 3000 <=人口<=5000

我只知道如何根据另一列中的值创建具有二进制 TRUE/FALSE 结果的列,例如

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

但我不确定这样做是为了在不同的条件下获得不同的数字。任何人都可以提供帮助吗?

4

3 回答 3

9

首先不要调用 a data.frame table,因为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).

于 2012-11-24T10:33:31.817 回答
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
于 2012-11-24T10:13:54.630 回答
2

只要您可以处理 5 是 <5001 而不是 <=5000 的任何数字,您可能只需要带有标签的 cut 函数。

# 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
    )
于 2012-11-24T10:32:08.830 回答