Преобразование двух векторов столбцов фрейма данных в один числовой столбец - PullRequest
0 голосов
/ 10 мая 2018

Рассмотрим следующую игрушку с данными моего исследования семян:

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" всем "жизнеспособным" наблюдениям и "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

Все предложения приветствуются

Ответы [ 3 ]

0 голосов
/ 10 мая 2018

Базовый раствор 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)
0 голосов
/ 10 мая 2018

Как упоминалось zx8754, вы можете взглянуть на свойства фактора.

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

Здесь сначала я переупорядочиваю уровни df$fate1, поэтому мертвым присваивается 1, жизнеспособным 2 и прорастает до 3. Вы хотите начать последовательность с 0, поэтому я должен вычесть 1после преобразования коэффициента в числовую переменную.

0 голосов
/ 10 мая 2018

Использование 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 гораздо более изящны, чем это, но то, что я дал выше, все равно будет работать, даже если у нас будут не числовые замены.

...