#r #conditional-statements #row
#r #условные операторы #строка
Вопрос:
У меня есть набор данных, который выглядит так в R:
A <- c("X", "Y", "Z", "W", "U")
B <- c("apple", "pear", "apple", "pear", "pear")
C <- c("december", "december" ,"June", "june", "march")
D <- c("Winter", "Summer" ,"Winter", "Summer", "Summer")
df <- data.frame(A,B,C,D);df
A B C D
1 X apple december Winter
2 Y pear december Summer
3 Z apple June Winter
4 W pear june Summer
5 U pear march Summer
Я хотел бы объединить строку по столбцу C (чтобы смешать строку 1 со строкой 2 и строку 3 со строкой 4), но я также хочу заменить значение в строке B, принимая во внимание столбец D. В принципе, когда 2 значения являются неопределенными в C (например, «декабрь»), что значениезначение в B, когда D — «Лето» («груша»), всегда заменяется значением в B, когда D — «Зима» (яблоко)
Я хотел бы иметь в конце такой фрейм данных :
A B C D
1 X apple december Winter,Summer
2 Z apple june Winter,Summer
3 U pear march Summer
Я действительно хочу сохранить 2 значения в столбце D, когда были объединены 2 строки.
У кого-нибудь есть идея?
Ответ №1:
Опция data.table
setDT(df)[
,
c(
lapply(
setNames(.(A, B), c("A", "B")),
function(x) if ("Winter" %in% D) replace(x, D == "Summer", x[D == "Winter"]) else x
),
.(D = D)
),
C
][
,
lapply(.SD, function(x) toString(unique(x))),
C
][,
.SD,
.SDcols = names(df)
]
дает
A B C D
1: X apple december Winter, Summer
2: Z apple june Winter, Summer
3: U pear march Summer
Данные
> dput(df)
structure(list(A = c("X", "Y", "Z", "W", "U"), B = c("apple",
"pear", "apple", "pear", "pear"), C = c("december", "december",
"june", "june", "march"), D = c("Winter", "Summer", "Winter",
"Summer", "Summer")), class = "data.frame", row.names = c(NA,
-5L))
Комментарии:
1. Спасибо! это работает хорошо. У меня есть еще один вопрос по этому поводу. Если у меня есть NA в столбце C, как я могу сделать так, чтобы они не были объединены вместе?
Ответ №2:
Опция с dplyr
library(dplyr)
library(tidyr)
df %>%
group_by(C = tolower(C)) %>%
mutate(across(c(A, B), ~ if(n_distinct(D) > 1) replace(., D %in% 'Summer', NA) else
.)) %>%
fill(c(A, B)) %>%
summarise(across(c(A, B), first), D = toString(D), .groups = 'drop')
# A tibble: 3 x 4
# C A B D
#* <chr> <chr> <chr> <chr>
#1 december X apple Winter, Summer
#2 june Z apple Winter, Summer
#3 march U pear Summer
Комментарии:
1. Спасибо. Я попробовал этот код с аналогичным data.frame, чем тот, который я отправил, но с символами, а не с факторами. В итоге у меня есть NA в столбцах A и B… Причина почему?
2. @VG-29 Можете ли вы попробовать преобразовать в символьный класс, т.е.
df %>% type.convert(as.is = TRUE) %>% group_by(..