изменение базы ячеек на другом кадре данных в R - PullRequest
1 голос
/ 07 апреля 2020

Я хочу создать новый столбец со значением другого кадра данных, в этом случае, если ячейка в df1 == 1, новым значением является текущая ячейка df2

df1 <- c("1","2","3","4","5")
df2 <- c("a","b","c","d","e")

df <- cbind(df1,df2)
df
     df1 df2
[1,] "1" "a"
[2,] "2" "b"
[3,] "3" "c"
[4,] "4" "d"
[5,] "5" "e"

Ожидаемый ответ будет;

     df1 df2  my.column
[1,] "1" "a"     "a"
[2,] "2" "b"     "2"
[3,] "3" "c"     "3"
[4,] "4" "d"     "4"
[5,] "5" "e"     "5"

большое спасибо заранее

Ответы [ 2 ]

2 голосов
/ 07 апреля 2020

Вы можете использовать ifelse:

transform(df, my_col = ifelse(df1 == 1, df2, df1))

#  df1 df2 my_col
#1   1   a      a
#2   2   b      2
#3   3   c      3
#4   4   d      4
#5   5   e      5

Эквивалент в dplyr:

library(dplyr)
df %>%mutate(my_col = ifelse(df1 == 1, df2, df1))

Или сначала скопировать df1 значения, а затем заменить.

df$my_col <- df$df1
df$my_col[df$df1 == 1] <- df$df2[df$df1 == 1]

данные

df <- data.frame(df1,df2, stringsAsFactors = FALSE)
1 голос
/ 07 апреля 2020

Использование data.table сделает назначение на месте

library(data.table)
setDT(df)[, my_col := df1][df1 == 1, my_col := df2]
df
#   df1 df2 my_col
#1:   1   a      a
#2:   2   b      2
#3:   3   c      3
#4:   4   d      4
#5:   5   e      5

Или с fifelse

setDT(df)[, my_col := fifelse(df1 == 1, df2, df1)]

Или с использованием fcase

setDT(df)[, my_col := fcase(df1 == 1, df2, default = df1)]

данные

df <- data.frame(df1,df2, stringsAsFactors = FALSE)
...