Как я могу включить информацию из нескольких строк в одну на основе идентификатора в R? - PullRequest
1 голос
/ 27 мая 2020

В R я хотел бы сделать свой набор данных пригодным для исследования, включив информацию о нескольких строках с одним и тем же идентификатором в одну строку. Мой набор данных имеет структуру, в которой каждый id уникален, но есть несколько строк, содержащих информацию для этого id. Поскольку в каждой строке уже хранится некоторая информация со значением 7 как number, я хотел бы сохранить эти строки и включить остальную информацию из других строк.

Мой набор данных имеет следующую структуру:

id    number  var1  var2  var3  var4 var5

id01  3       a     NULL  6     4    5
id01  3       a     3     NULL  9    8
id02  2       b     NULL  22    4    NULL
id02  4       b     NULL  NULL  7    4
id02  7       b     NULL  NULL  9    8
id02  7       b     6     NULL  8    6
id03  2       c     NULL  33    4    1
id03  6       c     NULL  NULL  9    3
id03  7       c     9     NULL  7    9
id04  2       d     NULL  98    9    2
id04  3       d     NULL  NULL  4    NULL
id04  4       d     NULL  NULL  7    NULL
id04  7       d     7     NULL  8    2

И это мой желаемый результат:

id      var1  var2  var3  var4     var5

id01    a     3     6     4;9      NA
id02    b     6     22    4;7;8;9  8;6
id03    c     9     33    4;7;9    9
id04    d     7     98    4;7;8;9  2

Как видите, существует несколько случаев

  • В var1 все значения столбцов для строк, соответствующих идентификатору, равны значению, которое должно быть включено в желаемый набор данных. Поскольку желательно сохранить строку с номером 7, я думаю, что нам не нужно ничего делать, чтобы сохранить это значение в желаемом выходе.
  • In var2 и var3 все значения столбцов равны NULL, за исключением одной строки, которая имеет значение (в разных местах для var2 и var3). Значение должно быть включено в желаемый набор данных
  • В var4 все значения столбцов должны быть включены в желаемый набор данных в одной строке, разделенной точкой с запятой (конкретный символ разделения не имеет значение)
  • В var5 значение строки с 7 под number должно оставаться в наборе данных. Например, для id=03 значение в этой строке для var5 должно появиться в новом наборе данных (9). Если совпадений с 7 под number нет, следует указать NA. Если есть несколько совпадений, они должны быть напечатаны в строке, разделенной (например) точкой с запятой.

Я хотел бы определить поведение для каждого столбца, а не для всего набора данных . Как мне подойти к этому в R?

Ответы [ 2 ]

2 голосов
/ 27 мая 2020

Вы можете суммировать каждый столбец по группе.

library(dplyr)

df %>%
  group_by(id) %>%
  summarise(var1 = first(var1),
            var2 = if(all(is.na(var2))) NA else na.omit(var2),
            var3 = if(all(is.na(var3))) NA else na.omit(var3),
            var4 = toString(sort(var4)),
            var5 = na_if(toString(var5[number == 7]), ""),
            number = 7)

# # A tibble: 4 x 7
#   id    var1   var2  var3 var4       var5  number
#   <fct> <fct> <int> <int> <chr>      <chr>  <dbl>
# 1 id01  a         3     6 4, 9       NA         7
# 2 id02  b         6    22 4, 7, 8, 9 8, 6       7
# 3 id03  c         9    33 4, 7, 9    9          7
# 4 id04  d         7    98 4, 7, 8, 9 2          7

Примечание: number должно быть указано после var5. Если вы установите number = 7 перед var5, тогда значения в number будут переопределены как 7, так что var5 = var5[number == 7] не будет работать.


Data

df <- structure(list(id = structure(c(1L, 1L, 2L, 2L, 2L, 2L, 3L, 3L, 
3L, 4L, 4L, 4L, 4L), .Label = c("id01", "id02", "id03", "id04"
), class = "factor"), number = c(2L, 7L, 2L, 4L, 5L, 7L, 2L, 
6L, 7L, 2L, 3L, 4L, 7L), var1 = structure(c(1L, 1L, 2L, 2L, 2L, 
2L, 3L, 3L, 3L, 4L, 4L, 4L, 4L), .Label = c("a", "b", "c", "d"
), class = "factor"), var2 = c(NA, 3L, NA, NA, NA, 6L, NA, NA, 
9L, NA, NA, NA, 7L), var3 = c(6L, NA, 22L, NA, NA, NA, 33L, NA, 
NA, 98L, NA, NA, NA), var4 = c(4L, 9L, 4L, 7L, 9L, 8L, 4L, 9L, 
7L, 9L, 4L, 7L, 8L), var5 = c(5L, 8L, NA, 4L, 8L, 6L, 1L, 3L, 
9L, 2L, NA, NA, 2L)), class = "data.frame", row.names = c(NA, -13L))
0 голосов
/ 27 мая 2020

в Base-R

Если NULL в ваших данных является строкой. Вы захотите изменить mydata на то, что вы назвали свои данные.

as.data.frame(do.call(rbind,
    lapply(split(mydata, mydata$id), apply, 2, function(x) paste(unique(x[x!="NULL"]),collapse=';') )
))

output:

       id  number var1 var2 var3    var4
id01 id01     2;7    a    3    6     4;9
id02 id02 2;4;5;7    b    6   22 4;7;9;8
id03 id03   2;6;7    c    9   33   4;9;7
id04 id04 2;3;4;7    d    7   98 9;4;7;8

Data:

mydata <- structure(list(id = structure(c(1L, 1L, 2L, 2L, 2L, 2L, 3L, 3L, 
3L, 4L, 4L, 4L, 4L), .Label = c("id01", "id02", "id03", "id04"
), class = "factor"), number = c(2L, 7L, 2L, 4L, 5L, 7L, 2L, 
6L, 7L, 2L, 3L, 4L, 7L), var1 = structure(c(1L, 1L, 2L, 2L, 2L, 
2L, 3L, 3L, 3L, 4L, 4L, 4L, 4L), .Label = c("a", "b", "c", "d"
), class = "factor"), var2 = structure(c(5L, 1L, 5L, 5L, 5L, 
2L, 5L, 5L, 4L, 5L, 5L, 5L, 3L), .Label = c("3", "6", "7", "9", 
"NULL"), class = "factor"), var3 = structure(c(3L, 5L, 1L, 5L, 
5L, 5L, 2L, 5L, 5L, 4L, 5L, 5L, 5L), .Label = c("22", "33", "6", 
"98", "NULL"), class = "factor"), var4 = c(4L, 9L, 4L, 7L, 9L, 
8L, 4L, 9L, 7L, 9L, 4L, 7L, 8L)), class = "data.frame", row.names = c(NA, 
-13L))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...