#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")