Cbind / Rbind с условием Ifelse
Вот код, с которым я работаю:
x <- c("Yes","No","No","Yes","Maybe")
y <- t(1:10)
z <- t(11:20)
rbind.data.frame(ifelse(x == "Yes",y,z))
Это производит
X1L X12L X13L X4L X15L
1 1 12 13 4 15
Желаемый результат:
x
1 Yes 1 2 3 4 5 6 7 8 9 10
2 No 11 12 13 14 15 16 17 18 19 20
3 No 11 12 13 14 15 16 17 18 19 20
4 Yes 1 2 3 4 5 6 7 8 9 10
5 Maybe 11 12 13 14 15 16 17 18 19 20
Я думал, что мог бы использовать оператор ifelse с функцией rbind.data.frame () или cbind.data.frame (). Так что еслиx == "Yes"
тогда это будет объединено с вектором "у". Как показано в первом ряду желаемого выхода. Обратно еслиx!="Yes"
тогда это будет объединено с вектором "z". Как бы я поступил так? Я также подумал, что может быть возможно индексирование с помощью функции which (), но я не мог придумать, как бы это использовать.
ОБНОВИТЬ ДРУГОЙ ВОПРОС
Вот код, с которым я работаю:
a <- c(1,0,1,0,0,0,0)
b <- 1:7
t(sapply(a, function(test) if(test==0) b else 0))
Which produces
[,1] [,2] [,3] [,4] [,5] [,6] [,7]
[1,] 0 Integer,7 0 Integer,7 Integer,7 Integer,7 Integer,7
Кто-нибудь из вас может это объяснить? Приведенный ниже код работает, но мне было интересно, почему функция sapply не работает. Также, как бы я сохранить матрицу, которая создается ниже?
`row.names<-`(t(t(rbind(b,0))[,(a!='1')+1L]),x)
Ответ на мой самый последний вопрос
Для работы функции sapply необходимо, чтобы входные данные в операторе else были вектором, поэтому
a <- c(1,0,1,0,0,0,0)
b <- 1:7
c <- rep(0, times = length(a))
t(sapply(a, function(test) if(test==0) b else c))
Теперь это дает правильный результат.