R: новые значения переменных на основе уровней факторов другой переменной - PullRequest
3 голосов
/ 20 июня 2019

Я пытаюсь создать новую переменную (var5), которая получает значение от одной из других числовых переменных в кадре данных (var1, var2 или var3) на основе уровня факторной переменной (var4)

variables=data.frame(var1=c(2,3,4,5), var2=c(20,30,40,50), var3=c(200,300,400,500), var4=c('var1','var2','var3','var1'))

переменные

  var1 var2 var3 var4
1    2   20  200 var1
2    3   30  300 var2
3    4   40  400 var3
4    5   50  500 var1 

Ожидаемый результат будет следующим:

  var1 var2 var3 var4 var5
1    2   20  200 var1    2
2    3   30  300 var2   30
3    4   40  400 var3  400
4    5   50  500 var1    5

Я не могу найти способ решить это.

Ответы [ 4 ]

3 голосов
/ 20 июня 2019
for(i in 1:nrow(df)) {
  df$var5[i] <- df[which(colnames(df)==df$var4[i]), i]
}

с саппли (спасибо, Андрей :-))

df$var5 <- unlist(sapply(seq_along(df), function(x) df[x, match(df$var4[x], names(df))]))

Это работает динамически. (case_when может быть болезненно, если у вас есть 100 различных столбцов).

1 голос
/ 20 июня 2019
variables=data.frame(var1=c(2,3,4,5), var2=c(20,30,40,50), 
                     var3=c(200,300,400,500), var4=c('var1','var2','var3','var1'))

library(tidyverse)

variables %>%
  mutate(var5 = pmap_chr(
    .l = .,
    .f = function(...){
      row <-  c(...)
      cols <- row["var4"] %>% `[[`(1)
      vals <- row[cols] %>% str_c()
      return(vals)
    }
  ))

#>   var1 var2 var3 var4 var5
#> 1    2   20  200 var1    2
#> 2    3   30  300 var2   30
#> 3    4   40  400 var3  400
#> 4    5   50  500 var1    5

Создано в 2019-06-20 пакетом Представ (v0.3.0) в отношении мутировать конкретный столбец путем оценки значения ячейки поиска

1 голос
/ 20 июня 2019

Использование data.table:

library(data.table)
setDT(variables)[, var5 := ifelse(var4 == "var1", var1, ifelse(var4 == "var2", var2, var3))]



    var1 var2 var3 var4 var5
1:    2   20  200 var1    2
2:    3   30  300 var2   30
3:    4   40  400 var3  400
4:    5   50  500 var1    5
1 голос
/ 20 июня 2019

Я уверен, что кто-то может придумать что-нибудь более причудливое, но dplyr::case_when() выполнит свою работу:

library(dplyr)

data.frame(
  var1 = c(2, 3, 4, 5),
  var2 = c(20, 30, 40, 50),
  var3 = c(200, 300, 400, 500),
  var4 = c('var1', 'var2', 'var3', 'var1')) %>%
  mutate(var5 = case_when(var4 == "var1" ~ var1,
                          var4 == "var2" ~ var2,
                          var4 == "var3" ~ var3))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...