Присвойте значения указанной c строке и нескольким столбцам в кадре данных на основе условия - PullRequest
1 голос
/ 17 июня 2020

Я застрял в написании кода, и мне нужна ваша помощь. Проблема заключается в следующем:

У меня есть фрейм данных под названием «таблица», который выглядит следующим образом:

> dput(table)
structure(list(ID = c(1405720, 1700870, 1774430, 1844160, 2187710, 
2215320, 2513640, 2581470, 2880020, 3092980, 5514080, 5519800, 
5537980, 5553200, 5556930, 5562970, 5565930, 5605290, 5632260, 
5632260), LA = c(1, 1, 1, 1, 1, 0, 1, 1, 1, 0, 0, 0, 1, 0, 1, 
0, 0, 1, 1, 1), tA = c(450, 480, 590, 400, 335, 430, 480, 1035, 
570, 590, 480, 484, 528, 460, 380, 520, 420, 420, 515, 515), 
    tB = c(1080, 810, 930, 960, 960, 960, 810, 1035, 765, 1080, 
    990, 1140, 528, 750, 660, 855, 975, 975, 990, 990)), row.names = c(NA, 
20L), class = "data.frame")

В этом фрейме данных «ID» представляет человека и «tA» и «tB» представляет два времени дня, измеряемых в минутах и ​​начинающихся в 00:00.

У меня также есть еще один фрейм данных под названием «df_time», который содержит «идентификаторы» и столбец для каждой минуты день, заполненный нулями.

df_time <- matrix(0,nrow = 20 , ncol = 1441, byrow=TRUE)
df_time[,1] <- table$ID

Теперь я хочу изменить нулевые значения в df_time в зависимости от условия. Условие выглядит следующим образом: если таблица $ LA == 1, заполните столбцы в df_time от таблицы $ tA до таблицы $ tB единицами. В противном случае оставьте 0 в df_time. Вот небольшой пример: скажем, в первой строке «таблицы» LA == 1 и tA == 450 и tB == 600. Теперь код должен заполнить все столбцы в первой строке df_time номерами столбцов. с 451 до 601 с единицами. (Мне нужно было добавить +1 ко времени «tA» и «tB», потому что столбец «ID» занимает первое место / столбец в моем фрейме данных df_time, и, таким образом, минуты дня начинаются со второго столбца.)

Следующий код - это один из фрагментов кода, который я пытался использовать. Надеюсь, этот код также поможет вам понять условие. Мне нужно было добавить +1 ко времени «tA» и «tB» из-за того, что столбец «ID» занимает первое место / столбец в моем фрейме данных df_time и, таким образом, минуты дня начинаются со второго столбца. z - это просто случайное присвоение, которое я выбрал для оператора else. Он ничего не делает.

for(i in nrow(table)){
  if (table[i,"LA"] == 1){
    x = table[i, "tA"]+1
    y = table[i, "tB"]+1
  } else {
    z = 0
  }

  df_time[i, x:y] <- 1

}

Ответы [ 2 ]

0 голосов
/ 17 июня 2020

Я думаю, что использование data.table даст эффективное и довольно ясное решение:

library(data.table)
setDT(table)
table[LA==1,tA:=tA+1]
table[LA==1,tB:=tB+1]
0 голосов
/ 17 июня 2020

Вот способ без al oop:

#Initialize the `df_time` dataframe
df_time <- matrix(0,nrow = 20 , ncol = 1440)
#Get row index where LA = 1
inds <- which(table$LA == 1)
#Create a sequence between tA and tB columns adding creating row column matrix
#and turn those values to 1
df_time[do.call(rbind, Map(function(x, y, z) cbind(z, x:y), 
                table$tA[inds], table$tB[inds], inds))] <- 1

Я не добавлял значение ID изначально, чтобы не делать +1 в столбцы tA и tB. Вы можете cbind результат.

cbind(table$ID, df_time)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...