Как обновить несколько строк с повторениями на основе значений в одном столбце? - PullRequest
1 голос
/ 05 апреля 2019

У меня есть набор метрик для изображений веб-сайтов, которым необходимо перезаписать данные NA. Ранее я присоединился к двум таблицам на website_index. Однако теперь мне нужно вернуться и добавить несколько столбцов данных для нескольких строк. Я не уверен, смогу ли я снова присоединиться к таблице (это создаст дубликаты, так как некоторые данные уже есть?) Должен ли я использовать другой метод?

Я должен добавить, что это охватывает тысячи строк данных. website_index повторяется несколько раз, и я пытаюсь добавить более 20 столбцов значений. Поэтому я бы предпочел не использовать c() для ручного добавления значений столбцов в строку, так как я мог бы сделать ошибку копирования всех значений.

Пример набора данных, который я пытаюсь обновить

website_index metric1 metric2
1               NA      NA
2               NA      NA
3              "red"    "green"
4              "blue"   "green"

хотел бы, чтобы набор данных выглядел следующим образом

website_index metric1 metric2
1              "value1"   "value2"
2              "value3"   "value4"
3              "red"    "green"
4              "blue"   "green"

Ответы [ 3 ]

0 голосов
/ 05 апреля 2019

Для безумно больших наборов данных, где требуется память и скорость, следующее решение с использованием data.table должно быть быстрее.Для нормальных сценариев используйте решение по адресу @ www

library(data.table)
setDT(dat)
for (j in names(dat)) set(dat, which(is.na(dat[[j]])), j, "value")
0 голосов
/ 06 апреля 2019

ОБНОВЛЕНИЕ, ЧТОБЫ СООТВЕТСТВОВАТЬ РЕДАКТАМ OP

Решение с использованием базы для петель.

#example data frame
x <-  data.frame(web = c(1,2,3,4), metrc = c(NA,NA,'red','blue'), metrc2 = c(NA, NA, 'green','green'), stringsAsFactors = FALSE)


#initializing empty vector
l <- c()

#creating "value" with a count of NAs in data frame
for(i in 1:sum(is.na(x))){
    l[[i]] <- paste0('value',i)
 }

#nested for loop that check each row, column, fills in first item from the vector
#to the NA, and removes item from vectors.

for(i in 1:nrow(x)){
  for(j in 1:ncol(x)){
    if(is.na(x[i,j])) {

      x[i,j] <- l[[1]]
      l <- l[l!=l[1]]

    }
  }
}

Это самый эффективный способ?Сомнительно.Тем не менее, я не совсем уверен, что это отвечает на ваш настоящий вопрос, так как вы упомянули присоединение к таблицам.Может быть, добавление таблицы примеров, к которой вы хотели бы присоединиться, как предложил @Frank, поможет?

0 голосов
/ 05 апреля 2019

Вот способ заменить NA на "value".

dat[is.na(dat)] <- "value"
dat
#   website_index metric1 metric2
# 1             1   value   value
# 2             2   value   value
# 3             3     red   green
# 4             4    blue   green`

DATA

dat <- read.table(text = "website_index metric1 metric2
1               NA      NA
                  2               NA      NA
                  3              'red'    'green'
                  4              'blue'   'green'",
                  header = TRUE, stringsAsFactors = FALSE)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...