проблемы с установкой фрейма данных с помощью dplyr, tidyr. data.table и изменить форму - PullRequest
0 голосов
/ 12 июля 2020

У меня действительно огромный набор данных, я делюсь им с помощью ссылки , потому что я не знаю другого способа показать его вам другим способом. Мне нужно, чтобы файл выглядел как это . Вторая ссылка - это пример полного файла, потому что делать это «вручную» очень долго.

Мне было предложено попробовать это Но, похоже, Мне показалось, что моего примера в этом посте было недостаточно, потому что с любым из предложений я получаю тот результат, который мне нужен. Я пытался в течение недели, и я действительно не знаю, как решить эту проблему, поэтому я решил опубликовать свои настоящие данные, используя ссылку, на случай, если это будет более полезно. Когда я пытаюсь использовать dplyr и tidyr, я получаю это предупреждающее сообщение

d<-read.csv("m.tot3.csv",header=TRUE, sep=",",dec=".")
df<-data.frame(d)

library(dplyr)
library(tidyr)
library(data.table)

sub1 <- df[c(TRUE, FALSE),]
sub2 <- df[c(FALSE, TRUE),]

tibble(ind = c(row(sub1)), col1 = factor(unlist(sub1), levels = letters[1:1688]), 
       col2 = as.integer(unlist(sub2))) %>% 
  pivot_wider(names_from = col1, values_from = col2,
              values_fill = list(col2 = 0)) %>%
  select(-ind)

Я получаю это сообщение об ошибке

Error: Can't convert <double> to <list>.
Run `rlang::last_error()` to see where the error occurred.
In addition: Warning message:
Values in `col2` are not uniquely identified; output will contain list-cols.
 Use `values_fn = list(col2 = list)` to suppress this warning.
 Use `values_fn = list(col2 = length)` to identify where the duplicates arise
 Use `values_fn = list(col2 = summary_fun)` to summarise duplicates

Использование reshape

sub1 <- df[c(TRUE, FALSE),]
sub2 <- df[c(FALSE, TRUE),]

out <- reshape(
  data.frame(ind = c(row(sub1)), 
             col1 = factor(unlist(sub1), levels = letters[1:1688]), 
             col2 = as.integer(unlist(sub2))),
  idvar = 'ind', direction = 'wide', timevar = 'col1')[-1]

names(out) <- sub("col2\\.", "", names(out))
out[is.na(out)] <- 0
row.names(out) <- NULL

Я получаю это предупреждающее сообщение

    Warning messages:
1: In reshapeWide(data, idvar = idvar, timevar = timevar, varying = varying,  :
  there are records with missing times, which will be dropped.
2: In reshapeWide(data, idvar = idvar, timevar = timevar, varying = varying,  :
  multiple rows match for col1=NA: first taken`

наконец, используя data.table

 d_test<-melt(
   setDT(
    setnames(
      data.table::transpose(df), 
      paste(rep(1:(nrow(d)/2), each = 2), c("name", "value"), sep = "_"))),
  measure = patterns("name", "value"))[
    , dcast(.SD, variable ~ value1, value.var = "value2", fill = 0)]

Я получаю это

Я действительно не Я не знаю, как ее решить, и любой ответ приветствуется. С уважением

1 Ответ

1 голос
/ 12 июля 2020

Одна из проблем заключается в том, что преобразование factor с levels возвращает все NA, потому что levels не совпадают со значениями unique в наборе данных

library(dplyr)
library(tidyr)
library(data.table)
df1 <- tibble(ind = c(row(sub1)), 
       col1 = factor(unlist(sub1), levels = unique(unlist(sub1))), 
      col2 = as.integer(unlist(sub2)))

Вторая проблема есть ли дубликаты, поэтому мы создаем столбец последовательности по 'col1'

out <- df1 %>% 
    mutate(rn = rowid(col1)) %>%
    pivot_wider(names_from = col1, values_from = col2,
           values_fill = list(col2 = 0)) %>%
    select(-rn)

dim(out)
#[1]   23 3704


out[1:5, 1:5]
# A tibble: 5 x 5
#    ind  `69`  `70`  `71`  `82`
#  <int> <int> <int> <int> <int>
#1     1     2     0     0     0
#2     2     0     4     0     0
#3     3     0     0     6     0
#4     4     0     0     0     8
#5     5     0     0     0     0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...