2014-11-03 6 views
0

Это кажется простым, но я не мог выполнить. Его отличие, чем звук аналогичный вопрос задать here. Я хочу, чтобы создать новые столбцы говорят df$col1, df$col2, df$col3 на dataframe df, используя условие в колонке уже существует то есть df$con и df$val.Как создать новый столбец с условием if

  1. Я хотел бы записать значение столбца «VAL» в df$col1, если df$con > 3
  2. Я хотел бы записать значение Col df$val в df$col2, если df$con<2
  3. и я хотел бы, чтобы написать 30 % от df$val в df$col3 если df$con находится между 1 и 3.

Как я должен это делать? Ниже представлен мой dataframe df с двумя столбцами «con» для условия и «val» для использования значения.

dput(df) 
structure(list(con = c(-33.09524956, -36.120924, -28.7020053, 
-26.06385399, -18.45731163, -14.51817928, -20.1005132, -23.62346403, 
-24.90464018, -23.51471516), val = c(0.016808197, 1.821442227, 
4.078385886, 3.763593573, 2.617612605, 2.691796601, 1.060565469, 
0.416400183, 0.348732675, 1.185505136)), .Names = c("con", "val" 
), row.names = c(NA, 10L), class = "data.frame") 
+0

, что определяет значения для столбцов в строках, где условие не соответствует действительности? например каково значение 'col1', если' con' = <= 3? NA? –

+0

Итак, у вас есть два столбца всех значений NA в вашем примере? –

+2

@Citrus Рассмотрим пример, который отражает, по крайней мере, некоторые условия, а не одно, не отвечает ни одному из условий. – akrun

ответ

1

Это может сделать это. Сначала мы напишем функцию для изменения FALSE значения NA

foo <- function(x) { 
    is.na(x) <- x == FALSE 
    return(x) 
} 

Затем нанесите его на список логических векторов и принять соответствующий val столбца, значения

df[paste0("col", 1:3)] <- with(df, { 
    x <- list(con > 3, con < 2, con < 3 & con > 1) 
    lapply(x, function(y) val[foo(y)]) 
}) 

в результате

df 
     con  val col1  col2 col3 
1 -33.09525 0.0168082 NA 0.0168082 NA 
2 -36.12092 1.8214422 NA 1.8214422 NA 
3 -28.70201 4.0783859 NA 4.0783859 NA 
4 -26.06385 3.7635936 NA 3.7635936 NA 
5 -18.45731 2.6176126 NA 2.6176126 NA 
6 -14.51818 2.6917966 NA 2.6917966 NA 
7 -20.10051 1.0605655 NA 1.0605655 NA 
8 -23.62346 0.4164002 NA 0.4164002 NA 
9 -24.90464 0.3487327 NA 0.3487327 NA 
10 -23.51472 1.1855051 NA 1.1855051 NA 
+0

Не знаете, как работает foo (я относительно новичок в R), но ответ велик (upvote). – Marichyasana

+0

@Marichyasana - он принимает логический вектор, а любые элементы, которые являются FALSE, меняются на 'NA' –

0

Мог бы пойти на обратный путь. Трубы %>% просто посылают выходные данные каждой операции на следующую функцию. mutate позволяет вам создать новый столбец в вашем фрейме данных, но вы должны помнить, чтобы хранить его вверху. Он хранится как output. ifelse позволяет условно присваивать значения новому столбцу, например столбцу col1. Второй аргумент в ifelse - это результат для истинного условия, а третий аргумент - когда ifelse является ложным. Надеюсь, это тоже поможет!

Идите в сторону!

library(tidyverse) 

output <- df %>% 
    mutate(col1=ifelse(con>3, val, NA)) %>% 
    mutate(col2=ifelse(con<2, val, NA)) %>% 
    mutate(col3=ifelse(con<=3 & con>=1, 0.3*val, NA)) 

Вот df, что на самом деле отвечает некоторым из условий:

structure(list(con = c(-33.09524956, 2.5, -28.7020053, 2, -18.45731163, 
2, -20.1005132, 6, -24.90464018, -23.51471516), val = c(0.016808197, 
1.821442227, 4.078385886, 3.763593573, 2.617612605, 2.691796601, 
1.060565469, 0.416400183, 0.348732675, 1.185505136)), .Names = c("con", 
"val"), row.names = c(NA, 10L), class = "data.frame") 

Вот output после выполнения кода:

  con  val  col1  col2  col3 
1 -33.09525 0.0168082  NA 0.0168082  NA 
2 2.50000 1.8214422  NA  NA 0.5464327 
3 -28.70201 4.0783859  NA 4.0783859  NA 
4 2.00000 3.7635936  NA  NA 1.1290781 
5 -18.45731 2.6176126  NA 2.6176126  NA 
6 2.00000 2.6917966  NA  NA 0.8075390 
7 -20.10051 1.0605655  NA 1.0605655  NA 
8 6.00000 0.4164002 0.4164002  NA  NA 
9 -24.90464 0.3487327  NA 0.3487327  NA 
10 -23.51472 1.1855051  NA 1.1855051  NA 
Смежные вопросы