Как подставить в фрейм данных условный оператор на основе значений нескольких столбцов - PullRequest
0 голосов
/ 21 сентября 2019

Я пытаюсь установить подкадр данных на основе условий из нескольких столбцов.Вот мой фрейм данных.

var1 <- c(x,x,x,y,y,z,z,z,z) 
var2 <- c(a,b,c,a,b,a,b,c,d) 
var3 <- c(2,4,1,4,1,6,2,5,8)
data1 <- data.frame(var1,var2,var3)
# -------------------------------------------------------------------------
#     var1 var2 var3
# 1    x    a    2
# 2    x    b    4
# 3    x    c    1
# 4    y    a    4
# 5    y    b    1
# 6    z    a    6
# 7    z    b    2
# 8    z    c    5
# 9    z    d    8

Выход

Ожидаемый вывод:

#     var1
# 1    y
# 2    z

Условие

Ниже приведены условия, приводящие к выходу:

  1. Выходные данные представляют собой фрейм данных, в котором выбираются только значения var1.
  2. Значения var3, где var2 равен a, больше значений var3, где var2 равно b.

Я не могу создать код на основе этого сложного условия из нескольких столбцов.

Спасибо.

Ответы [ 3 ]

1 голос
/ 21 сентября 2019

Наиболее интуитивным решением может быть использование цикла for.Возможно, есть более короткие и изящные способы решения этой проблемы, но это должно сработать:

selection <- c()

for(i in unique(var1)) {
  var_store <- data1 %>%
    filter(var1 == i, var2 == a | var2 == b)

  if(filter(var_store, var2 == a) %>% 
    select(var3) %>% 
    as.numeric() > 
  filter(var_store, var2 == b) %>% 
    select(var3) %>% 
    as.numeric()) {

    selection <- c(selection , unique(var_store$var1))
  }
}

data1 %>% 
  filter(var1 %in% selection)


# # A tibble: 6 x 3
#   var1  var2   var3
#   <chr> <chr> <dbl>
# 1 y     a         4
# 2 y     b         1
# 3 z     a         6
# 4 z     b         2
# 5 z     c         5
# 6 z     d         8
1 голос
/ 21 сентября 2019

Это может дать вам коэффициент:

subset(data1, (var2=="a"))[subset(data1, (var2=="a"))$var3 > subset(data1, (var2=="b"))$var3, "var1"]

# [1] y z
# Levels: x y z

Вы можете использовать data.frame, чтобы получить то, что вы хотите, следующим образом:

data.frame(var1 = subset(data1, (var2=="a"))[subset(data1, (var2=="a"))$var3 > subset(data1, (var2=="b"))$var3, "var1"])
#   var1
# 1    y
# 2    z
0 голосов
/ 22 сентября 2019

Я обнаружил, что изменение формы данных может решить мою проблему.Я был транспонирован var2 с помощью dcast (), чтобы получить желаемый результат

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...