Я хочу разделять переменные в соответствии с «ведущей» переменной. x3 в следующем случае:Применение dcast странным способом
set.seed(2)
df = data.frame(x1 = sample(4), x2 = sample(4), x3 = sample(letters[1:2], size = 4, replace = TRUE))
df
# x1 x2 x3
# 1 1 4 a
# 2 3 3 b
# 3 2 1 b
# 4 4 2 a
# Desired output
# x3 x1.a x2.a x1.b x2.b
# a 1 4 NA NA
# b NA NA 3 3
# b NA NA 2 1
# a 4 2 NA NA
я как-то чувствую, что это может быть достигнуто с reshape2::dcast()
, но я мог бы получить только, чтобы работать в течение двух переменных в общей сложности:
reshape2::dcast(df[,2:3], seq_along(x3) ~ x3, value.var = "x2")[, -1]
# a b
# 1 2 NA
# 2 NA 1
# 3 NA 3
# 4 4 NA
Но может быть это просто полное злоупотребление dcast
. Есть ли элегантное решение этой проблемы, без разделения и слияния df
?
EDIT: Некоторые люди сказали, что сделать это ужасная идея, и что я, вероятно, не следует делать такие вещи. Позвольте мне уточнить, когда это может иметь смысл.
Представьте себе, что x3
является коммутатором для конкретного алгоритма. В этом случае возможны варианты a
и b
. Кроме того, x1
и x2
являются параметрами, которые могут выполнять оба алгоритма. К сожалению, оба алгоритма ведут себя по-разному при одних и тех же параметрах параметров для x1
и x2
, поэтому имеет смысл обрабатывать их как отдельные функции, чтобы отнести их неконтролируемость к учетной записи.
Ну, есть 'merge (df [df $ x3 ==" a ",], df [df $ x3 ==" b ",], by =" x3 ", all = TRUE)', но это естественно что не было бы изящного способа получить такой беспорядочный выход. – Frank
@agenis Это исправлено. –
@Frank Это становится беспорядочным, если я не сейчас дискретные значения 'x3'. –