изменить форму фрейма данных из столбцов в строки и свернуть значения ячеек

#r #transformation #reshape2 #melt

#r #преобразование #reshape2 #расплавить

Вопрос:

Вот проблема, с которой я сталкиваюсь. Я пытаюсь преобразовать этот набор данных

   a    b     c
  100  0     111
  0    137   17
  78   117   91
  

в (столбец в строки)

   col1  col2
  a     100,78
  b     137,117
  c     111,17,91
  

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

Ответ №1:

Вот облегченный вариант, использующий toString() метод свертывания каждого столбца в строку и использующий stack() для преобразования списка результатов в желаемый результат:

 stack(lapply(df, function(col) toString(col[col!=0])))

#       values ind
#1     100, 78   a
#2    137, 117   b
#3 111, 17, 91   c
  

Ответ №2:

Я бы использовал dplyr вместо изменения формы.

 library(dplyr)
library(tidyr)

Data <- data.frame(a=c(100,0,78),b=c(0,137,117),c=c(111,17,91))

Data %>%
  gather(Column, Value) %>%
  filter(Value != 0) %>%
  group_by(Column) %>%
  summarize(Value=paste0(Value,collapse=', '))
  

Функция сбора аналогична melt в reshape . group_by Функция сообщает более поздним функциям, которые вы хотите разделить, на основе значений в Column . Наконец, summarize вычисляется любая сводка, которую мы хотим для каждой из групп. В этом случае вставьте все термины вместе.

Что должно дать вам:

 # A tibble: 3 × 2
  Column       Value
   <chr>       <chr>
1      a     100, 78
2      b    137, 117
3      c 111, 17, 91
  

Ответ №3:

С library(data.table)

 melt(dt)[, .(value = paste(value[value !=0], collapse=', ')), by=variable]
#  variable       value
# 1:      a     100, 78
# 2:      b    137, 117
# 3:      c 111, 17, 91
  

Данные:

 dt = fread("a    b     c
100  0     111
0    137   17
78   117   91")