Подразделение кадра данных (длинный формат) на основе другого кадра данных (широкий формат), в которых случаи повторяются - PullRequest
0 голосов
/ 02 июня 2018

Я случайно выбрал 100 строк из моего кадра данных (содержащего 20 строк) в широком формате.Я использовал этот код r:

random_100 <- df.wide[sample(nrow(df.wide), 100, replace = T),]

. Он возвращает кадр данных, содержащий 100 строк (каждый с идентификатором пациента, результатом лечения, терапевтическим альянсом), в котором идентификатор пациента может повторяться.Это здорово, потому что это то, что я хотел.

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

random_long <- subset(df.long, (df.long$id %in% random_100$id))

Однако я не принимаю 100 пациентов (* продолжительность лечения), а только 20 пациентов.

Какой код мне нужно использовать, чтобы разрешитьПациент должен быть взят из длинного формата данных так часто, как это было случайно выбрано из моего широкоформатного кадра данных?

Надеюсь, мой вопрос достаточно ясен.

1 Ответ

0 голосов
/ 02 июня 2018

Возможно, есть более элегантное решение, но оно может дать вам желаемый результат

#make up some data
df.wide <- data.frame(id = 1:20, V1 = letters[1:20])

df.long <- data.frame(id = rep(1:20, 50), V2 = paste0("t", 1:1000))

#pull 100 random sampeles
set.seed(3)

random_100 <- df.wide[sample(nrow(df.wide), 100, replace = T),]

#count how many random samples were selected for each patient
x1 <- table(random_100$id)

#pull the corresponding number from df.long
a1 <- lapply(seq_along(x1), function(i) {
  y <- df.long[df.long$id == names(x1)[[i]],]  
  y1 <- y[sample(row.names(y), x1[[i]], replace = T),]
})

#combine
res <- do.call("rbind", a1)  
...