Репликация строк с разными значениями в одном столбце - PullRequest
0 голосов
/ 04 октября 2018

Может ли кто-нибудь помочь с реплицируемыми строками в R:

У меня есть такой набор данных, как -

ID Study X Y Z Time
1  2     3 4 5 0
2  2     3 4 5 0
3  2     3 4 5 0

Также есть вектор времени c(1,1.3,4,5,8,24,34,55,66)

Я бынравится копировать каждую строку с новыми строками в столбце Time со списком значений выше, например:

ID Study X Y Z Time
1  2     3 4 5 0
1  2     3 4 5 1
1  2     3 4 5 1.3
1  2     3 4 5 4

Ответы [ 2 ]

0 голосов
/ 04 октября 2018

Один способ сделать это так:

Данные:

dt <- read.table(text=c("ID Study X Y Z Time",
  "1  2     3 4 5 0",
  "2  2     3 4 5 0",
  "3  2     3 4 5 0"), header=T)

Решение:

vect <- list(c(0,1,1.3,4,5,8,24,34,55,66)) #convert the vector to a list
dt$Time <- vect #use that converted list to add as column, it will replace the existing Time column
dt <- tidyr::unnest(dt, Time) #use tidyr::unnest to unnest the column time

ИЛИ, как предлагает @thelatemail, вы можете использовать baseR следующим образом (используя векторизацию по умолчанию в Base R):

newdt <- dt[rep(seq_len(nrow(dt)), each=length(vect)),]
newdt$Time <- vect #We can see the vectorization of values in R here

У меня есть два предположения: существующая переменная Time полностью равна нулю, и вы хотитенулевое значение времени для каждого идентификатора сверху.

Выход :

   #   ID Study X Y Z Time
   # 1   1     2 3 4 5  0.0
   # 2   1     2 3 4 5  1.0
   # 3   1     2 3 4 5  1.3
   # 4   1     2 3 4 5  4.0
   # 5   1     2 3 4 5  5.0
0 голосов
/ 04 октября 2018

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

df$Time[-1] <- time_vec # alternatively: df$Time[2:n] <- time_vec where n = 10 in this case

Данные:

df <- data.frame(
  ID = 1:10,
  Study = rep(2, 10),
  X = rep(3, 10),
  Y = rep(4, 10),
  Z = rep(5, 10),
  Time = rep(0, 10)
)

time_vec <- c(1, 1.3, 4, 5, 8, 24, 34, 55, 66)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...