【问题标题】:Adding a new column in R data frame with values conditional on values of another column [duplicate]在R数据框中添加一个新列,其值取决于另一列的值[重复]
【发布时间】:2012-11-24 09:46:22
【问题描述】:

可能重复:
Assigning values to a df$column based on another column in the same df

假设我有数据框:

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

现在我想添加一个新列 table$size,其值为 1 如果人口

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

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

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

【问题讨论】:

  • 请更好地格式化您的问题。

标签: r dataframe


【解决方案1】:

首先不要调用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 &lt;- c(-Inf,500,1000,2000,3000,5001,Inf).

【讨论】:

  • +1: 对于这些问题,我认为findInterval() 总是比cut() 更整洁。仅供参考,我认为基本函数 table() 不会被调用数据框“表”覆盖(换句话说,您仍然可以使用 table() 函数) 但是调用数据框“表”确实会导致那些有 R 经验的人分心代码。
  • 作为我之前评论的后续,这是一个很好的问答:stackoverflow.com/q/6135868/1270695
  • 你是对的,但这是一个滑坡。如果您为数据对象使用基本函数名称,那么将它们用于用户定义的函数只是一小步。
  • 您的解决方案非常有效,直接触及问题的核心。感谢您的帮助。
【解决方案2】:

您可以为映射定义一个函数。因此包括您的不同垃圾箱:

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

【讨论】:

  • 这正是我想要的。谢谢。
  • 这很丑陋,而且对于更大的数据集很可能很慢。您至少应该使用矢量化的ifelse。
  • 我同意您的解决方案更好。直到现在才知道 findInterval 函数。
  • 要找到这些函数并不容易。如果您编辑答案以使用ifelse 而不是if 和sapply,您会得到我的支持。
  • 我应该只用谷歌搜索“查找间隔 r”:-/
【解决方案3】:

只要您可以处理 5 是

# 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
    )

【讨论】:

    猜你喜欢
    • 2021-03-01
    • 2021-08-25
    • 1970-01-01
    • 1970-01-01
    • 2014-03-20
    • 2019-04-22
    • 2020-09-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多