将数据框的两个列向量转换为单个数字列

时间:2018-05-10 10:08:07

标签: r dataframe numeric levels

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

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完成所有&#34; dead&#34; 的观察,并将&#34; 0&#34; 分配给每一个他们。同样,我想将&#34; 1&#34; 分配给所有&#34;可行的&#34; 观察和&#34; 2&#34 ; 对所有&#34;发芽&#34; 观察。

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

> 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

非常欢迎所有建议

3 个答案:

答案 0 :(得分:3)

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

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

首先我重新排序df$fate1的等级,所以dead被分配给1,可行到2并且发芽到3.你想在0开始序列,所以我必须在转换因子后减去1在数字变量中。

答案 1 :(得分:2)

使用case_when库中的dplyr

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提供的解决方案比这更优雅,但即使我们有非数字替换,我上面提到的仍然有效。

答案 2 :(得分:0)

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