слияние двух строк на основе условия и результата вывода в новый столбец R [дубликат]

Как насчет:

x[!unlist(lapply(x, is.null))]

Вот краткое описание того, что происходит.

  1. lapply сообщает нам, какие элементы являются NULL
    R> lapply(x, is.null)
    $a
    [1] FALSE
    
    $b
    [1] FALSE
    
    $c
    [1] TRUE
    
  2. Далее мы преобразуем список в вектор:
    R> unlist(lapply(x, is.null)) 
    a     b     c 
    FALSE FALSE  TRUE 
    
  3. Затем мы переключим TRUE на FALSE:
    R> !unlist(lapply(x, is.null))
        a     b     c 
    TRUE  TRUE FALSE 
    
  4. Наконец, мы выбираем элементы, используя обычные обозначения:
    x[!unlist(lapply(x, is.null))]
    
32
задан Jaap 21 May 2018 в 07:23
поделиться

2 ответа

plyr Попробуйте использовать toString:

# plyr
library(plyr)
ddply(data, .(A,B), summarize, C = toString(C))

Вот некоторые дополнительные альтернативы, также используя toString:

data.table

# alternative using data.table
library(data.table)
as.data.table(data)[, toString(C), by = list(A, B)]

aggregate Это не использует пакеты:

# alternative using aggregate from the stats package in the core of R
aggregate(C ~., data, toString)

sqldf

И вот альтернатива, использующая функцию SQL group_concat с помощью пакета sqldf :

library(sqldf)
sqldf("select A, B, group_concat(C) C from data group by A, B", method = "raw")

dplyr A dplyr альтернатива:

library(dplyr)
data %>%
  group_by(A, B) %>%
  summarise(test = toString(C)) %>%
  ungroup()
38
ответ дан G. Grothendieck 16 August 2018 в 11:14
поделиться

Измените, где вы положили as.character:

> out <- ddply(data, .(A, B), summarise, test = list(as.character(C)))
> str(out)
'data.frame':   4 obs. of  3 variables:
 $ A   : num  111 111 222 222
 $ B   : int  1 2 1 2
 $ test:List of 4
  ..$ : chr  "5" "7"
  ..$ : chr "6"
  ..$ : chr "9"
  ..$ : chr  "8" "10"
> out
    A B  test
1 111 1  5, 7
2 111 2     6
3 222 1     9
4 222 2 8, 10

Обратите внимание, однако, что каждый элемент по-прежнему фактически является отдельным символом, а не одной символьной строкой. То есть, это не настоящая строка, которая выглядит как «5, 7», а скорее два символа «5» и «7», которые R отображает с запятой между ними.

Сравните с следующее:

> out2 <- ddply(data, .(A, B), summarise, test = paste(C, collapse = ", "))
> str(out2)
'data.frame':   4 obs. of  3 variables:
 $ A   : num  111 111 222 222
 $ B   : int  1 2 1 2
 $ test: chr  "5, 7" "6" "9" "8, 10"
> out
    A B  test
1 111 1  5, 7
2 111 2     6
3 222 1     9
4 222 2 8, 10

. Сопоставимое решение в базе R, конечно, aggregate:

> A1 <- aggregate(C ~ A + B, data, function(x) c(as.character(x)))
> str(A1)
'data.frame':   4 obs. of  3 variables:
 $ A: num  111 222 111 222
 $ B: int  1 1 2 2
 $ C:List of 4
  ..$ 0: chr  "5" "7"
  ..$ 1: chr "9"
  ..$ 2: chr "6"
  ..$ 3: chr  "8" "10"
> A2 <- aggregate(C ~ A + B, data, paste, collapse = ", ")
> str(A2)
'data.frame':   4 obs. of  3 variables:
 $ A: num  111 222 111 222
 $ B: int  1 1 2 2
 $ C: chr  "5, 7" "9" "6" "8, 10"
10
ответ дан A5C1D2H2I1M1N2O1R2T1 16 August 2018 в 11:14
поделиться
Другие вопросы по тегам:

Похожие вопросы: