Вложенный цикл, чтобы найти самый последний комментарий - PullRequest
0 голосов
/ 13 декабря 2018

У меня есть таблица, которая включает 18 переменных, содержащих комментарии (обновления) к элементам рабочего процесса в бизнесе.Эти переменные называются от comment_0 до comment_17 .

Каждый раз, когда добавляются новые комментарии, они вставляются в самое верхнее пустое пространство для каждой соответствующей строки (т. Е. Если было 2 предыдущих комментария, то следующий комментарий добавляется в столбец comment_2 ).

Мне нужно создать новый столбец, который копирует последний комментарий для каждой соответствующей строки.Содержимое этого столбца было смоделировано в данных ниже под ' new_column '.

Данные:

df1 <- read.table(text = "comment_0   comment_1   comment_2   comment_3   comment_4   comment_5   new_column
NA  NA  NA  NA  NA  NA  NA
           text0   text1   text2   text3   text4   text5   text5
           NA  NA  NA  NA  NA  NA  NA
           text0   NA  NA  NA  NA  NA  text0
           NA  NA  NA  NA  NA  NA  NA
           NA  NA  NA  NA  NA  NA  NA
           text0   NA  NA  NA  NA  NA  text0
           text0   text1   text2   NA  NA  NA  text2
           text0   NA  NA  NA  NA  NA  text0
           text0   NA  NA  NA  NA  NA  text0", header = TRUE, stringsAsFactors = FALSE)

Ответы [ 2 ]

0 голосов
/ 13 декабря 2018

Обратный кадр данных, затем получить первое не-NA значение, используя dplyr :: coalesce :

library(dplyr)

coalesce(!!!df1[, 6:1])
# [1] NA      "text5" NA      "text0" NA      NA      "text0" "text2" "text0" "text0"

# test
identical(df1$new_column, coalesce(!!!df1[, 6:1]))
# [1] TRUE
0 голосов
/ 13 декабря 2018

Не нужно использовать циклы, мы можем использовать max.col с ties.method = "last", чтобы получить индекс столбца для последней записи не-NA в каждой строке, использовать cbind, чтобы создать пару строк-столбцов, а затем установить подкадр данных.

df$new_column <- df[cbind(1:nrow(df), max.col(!is.na(df), ties.method = "last"))]

df
#   comment_0 comment_1 comment_2 comment_3 comment_4 comment_5 new_column
#1       <NA>      <NA>      <NA>      <NA>      <NA>      <NA>       <NA>
#2      text0     text1     text2     text3     text4     text5      text5
#3       <NA>      <NA>      <NA>      <NA>      <NA>      <NA>       <NA>
#4      text0      <NA>      <NA>      <NA>      <NA>      <NA>      text0
#5       <NA>      <NA>      <NA>      <NA>      <NA>      <NA>       <NA>
#6       <NA>      <NA>      <NA>      <NA>      <NA>      <NA>       <NA>
#7      text0      <NA>      <NA>      <NA>      <NA>      <NA>      text0
#8      text0     text1     text2      <NA>      <NA>      <NA>      text2
#9      text0      <NA>      <NA>      <NA>      <NA>      <NA>      text0
#10     text0      <NA>      <NA>      <NA>      <NA>      <NA>      text0

Мы также можем использовать apply (не рекомендуется, когда вы можете max.col) построчно (с MARGIN = 1) и получать последнее значение не-NA в каждой строке.

df$new_column <- apply(df, 1, function(x)  x[which.max(cumsum(!is.na(x)))])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...