Конкатенация по строкам между конкретными столбцами данных

r apply paste string-concatenation sapply

42054 просмотра

3 ответа

У меня есть фрейм данных со столбцами, который при объединении (по строкам) в виде строки позволил бы мне разбить фрейм данных в желаемой форме.

> str(data)
'data.frame':   680420 obs. of  10 variables:
 $ A              : chr  "2011-01-26" "2011-01-26" "2011-02-09" "2011-02-09" ...
 $ B              : chr  "2011-01-26" "2011-01-27" "2011-02-09" "2011-02-10" ...
 $ C              : chr  "2011-01-26" "2011-01-26" "2011-02-09" "2011-02-09" ...
 $ D              : chr  "AAA" "AAA" "BCB" "CCC" ...
 $ E              : chr  "A00001" "A00002" "B00002" "B00001" ...
 $ F              : int  9 9 37 37 37 37 191 191 191 191 ...
 $ G              : int  NA NA NA NA NA NA NA NA NA NA ...
 $ H              : int  4 4 4 4 4 4 4 4 4 4 ...

Для каждой строки я хотел бы объединить данные в столбцах F, E, D и C в строку (с символом подчеркивания в качестве разделителя). Ниже моя неудачная попытка этого:

data$id <- sapply(as.data.frame(cbind(data$F,data$E,data$D,data$C)), paste, sep="_")

И ниже - нежелательный результат:

  > str(data)
    'data.frame':   680420 obs. of  10 variables:
     $ A              : chr  "2011-01-26" "2011-01-26" "2011-02-09" "2011-02-09" ...
     $ B              : chr  "2011-01-26" "2011-01-27" "2011-02-09" "2011-02-10" ...
     $ C              : chr  "2011-01-26" "2011-01-26" "2011-02-09" "2011-02-09" ...
     $ D              : chr  "AAA" "AAA" "BCB" "CCC" ...
     $ E              : chr  "A00001" "A00002" "B00002" "B00001" ...
     $ F              : int  9 9 37 37 37 37 191 191 191 191 ...
     $ G              : int  NA NA NA NA NA NA NA NA NA NA ...
     $ H              : int  4 4 4 4 4 4 4 4 4 4 ...
     $ id             : chr [1:680420, 1:4] "9" "9" "37" "37" ...
      ..- attr(*, "dimnames")=List of 2
      .. ..$ : NULL
      .. ..$ : chr  "V1" "V2" "V3" "V4"

Любая помощь будет принята с благодарностью.

Автор: Jubbles Источник Размещён: 08.07.2019 06:06

Ответы (3)


48 плюса

Решение

Пытаться

 data$id <- paste(data$F, data$E, data$D, data$C, sep="_")

вместо. Прелесть векторизованного кода в том, что вам не нужны построчные циклы или эквивалентные циклам * применения функции.

Редактировать Еще лучше

 data <- within(data,  id <- paste(F, E, D, C, sep=""))
Автор: Dirk Eddelbuettel Размещён: 10.06.2011 03:58

7 плюса

Использование uniteв tidyrупаковке:

require(tidyr)
data <- data %>% unite(id, F, E, D, C, sep = '_')

Первый параметр - это желаемое имя, все следующие до sep- столбцы для объединения.

Автор: JelenaČuklina Размещён: 09.08.2016 03:11

5 плюса

Либо stringr::str_c()или paste()будет работать.

require(stringr)
data <- within(data, str_c(F,E,D,C, sep="_")

или еще

data <- within(data, paste(F,E,D,C, sep="_")

( stringrлучшая производительность на больших наборах данных)

Автор: smci Размещён: 04.04.2014 11:30
Вопросы из категории :
32x32