【问题标题】:Converting two column vectors of a data frame into a single numeric column将数据框的两个列向量转换为单个数值列
【发布时间】:2018-05-10 10:08:06
【问题描述】:

考虑以下我的种子研究的玩具数据框:

site <- c(LETTERS[1:12])          
site1 <- rep(site,each=80)

fate <- c('germinated', 'viable', 'dead')
fate1 <- rep(fate,each=320)

number <- c(41:1000)

df <- data.frame(site1,fate1,number)

> str(df)
'data.frame':   960 obs. of  3 variables:
 $ site1 : Factor w/ 12 levels "A","B","C","D",..: 1 1 1 1 1 1 1 1 1 1 ...
 $ fate1 : Factor w/ 3 levels "dead","germinated",..: 2 2 2 2 2 2 2 2 2 2 ...
 $ number: int  41 42 43 44 45 46 47 48 49 50 ...

我希望 R 遍历所有 “死” 的观察结果,并将 “0” 分配给每个观察结果。同样,我想将 "1" 分配给所有 "viable" 观察结果,并将 "2" 分配给所有 "发芽"强>观察。

我的最终数据框将是一列,有点像这样:

> year16
  [1] 0 1 2 0 1 2 0 1 2 0 1 2 0 1 2 0 1 2 0 1 2 0 1 2 0 1 2 0 1 2 0 1 2 0 1 2 0
 [38] 1 2 0 1 2 0 1 2 0 1 2 0 1 2 0 1 2 0 1 2 0 1 2 0 1 2 0 1 2 0 1 2 0 1 2 0 1

非常欢迎所有建议

【问题讨论】:

标签: r dataframe numeric levels


【解决方案1】:

正如 zx8754 提到的,您可以查看一个因子的属性。

year16 <- as.numeric(factor(df$fate1, levels = c("dead", "viable", "germinated")))-1

这里首先我重新排序df$fate1 的级别,因此将死亡分配给 1,将可行分配给 2,然后发芽分配给 3。您希望序列从 0 开始,所以我必须在将因子转换为 a 后减去 1数值变量。

【讨论】:

  • 这个想法很聪明,我喜欢 +1,但我想知道重新散列因子中的每个条目的性能影响。
  • 谢谢@Kath。它的工作方式与蒂姆·比格莱森建议的方式相同。请阅读我在蒂姆的回答下的评论,以了解更多困惑。
  • @TimBiegeleisen 是的,你是对的!我实际上更喜欢您的解决方案,但我想提供一个基本的 R 方法。
  • @TimBiegeleisen 我在 15MM 数据集上进行了测试,诗歌(您的)解决方案速度慢了 6 倍
  • @Muneer rep(year16, df$number) 是否提供您想要的结果??
【解决方案2】:

使用来自dplyr 库的case_when

df$year16 <-
case_when(
    levels(df$fate1)[df$fate1] == "dead" ~ 0,
    levels(df$fate1)[df$fate1] == "viable" ~ 1,
    levels(df$fate1)[df$fate1] == "germinated" ~ 2,
    TRUE ~ -1
)

注意:@David 和 @kath 给出的解决方案比这更优雅,但即使我们有非数字替换,我上面给出的解决方案仍然有效。

【讨论】:

  • @Tim Biegeleisen,非常感谢。它解决了我的问题。但是,还有一个问题:例如如果在站点 A 中有 40 个“发芽”的种子,它只是将 1 分配给所有 40 个。但是,我想重复 1 四十次。有可能吗?
  • 分配 1 40 次和重复 1 40 次有什么区别?
  • 从字面上看,没有区别。一旦我运行模型,它可能会产生一些影响。
  • 问题是两种解决方案都给我 0、1 和 2 各 12 次,这是我不想要的。
【解决方案3】:

基础 R 解决方案:

assignnum <- function(x) {

  if (x == 'viable') {
    z <- 1
} else if (x == 'dead') {
  z <- 0
} else if (x == 'germinated') {
  z <- 2  
}
  return(z)
}

df['result'] <- sapply(df$fate1, assignnum)

【讨论】:

    猜你喜欢
    • 2013-10-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-25
    • 1970-01-01
    • 1970-01-01
    • 2016-08-29
    相关资源
    最近更新 更多