R: цикл по столбцам, выбрать значение из столбца и записать его в новый столбец в той же строке - PullRequest
1 голос
/ 22 апреля 2019

У меня есть датафрейм в следующем формате

id   var1  val1 status1 var2 val2 status2 var3 val3 status3 
123  a     12   false   b    23   true    c    34   true    

Здесь я хочу перейти через каждый столбец строки, получить первое вхождение статуса true для переменной и сохранить его в новой строке.Вот ожидаемый результат для приведенного выше примера.

Есть ли способ сделать это без использования 2 для циклов.(цикл внутри цикла).

id   var1  val1 status1 var2 val2 status2 var3 val3 status3 firstOccured
123  a     12   false   b    23   true    c    34   true    b

1 Ответ

3 голосов
/ 22 апреля 2019

Мне кажется, что было бы легче работать с данными в длинном формате. Таким образом, первым было бы изменить форму с широкого на длинный

dat_long <- reshape(dat, idvar = "id", varying = 2:ncol(dat), direction = "long", sep = "")

Предполагая, что у вас более одной группы id, вы можете использовать ave (для группировки) и match (чтобы получить первый индекс "true" в status) следующим образом:

dat_long <- transform(dat_long,
                      firstOccured = ave(status, id, FUN = function(x) var[match("true", x)])) 

Результат

dat_long
#       id time var val status firstOccured
#123.1 123    1   a  12  false            b
#123.2 123    2   b  23   true            b
#123.3 123    3   c  34   true            b

Если нам нужно вернуться к широкоформатному формату, мы можем сделать

out <- reshape(dat_long, idvar = "id", timevar = "time", direction = "wide", sep = "")
out <- out[setdiff(names(out), c("firstOccured1", "firstOccured2"))]
out
#       id var1 val1 status1 var2 val2 status2 var3 val3 status3 firstOccured3
#123.1 123    a   12   false    b   23    true    c   34    true             b

Данные

dat <- structure(list(id = 123L, var1 = "a", val1 = 12L, status1 = "false", 
    var2 = "b", val2 = 23L, status2 = "true", var3 = "c", val3 = 34L, 
    status3 = "true"), .Names = c("id", "var1", "val1", "status1", 
"var2", "val2", "status2", "var3", "val3", "status3"), class = "data.frame", row.names = c(NA, 
-1L))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...