Как извлечь столбец csv из фрейма данных и объединить его с существующим фреймом данных - PullRequest
0 голосов
/ 11 февраля 2019

У меня есть фрейм данных, который содержит данные из вопросника в широком формате.Но один столбец содержит сжатые экспериментальные данные с данными в формате csv (в виде строки символов) в длинном формате.Поэтому я хочу отменить это сжатие и восстановить полный набор табличных данных.Значения из широкоформатного формата следует повторить, чтобы заполнить добавленные строки.

Так что это будет мой кадр данных:

    df_wide <- data.frame(v1 = c("1", "2", "3"), 
                  v2 = c("sender, correct, \n1, y, \n2, y,", 
                      "sender, correct, \n2, n, \n1, n,", 
                      "sender, correct, \n1, n, \n2, y,"))
    colnames(df_wide) <- c("ID", "csvcolumn")
    df_wide$csvcolumn <- as.character(df_wide$csvcolumn)

> df_wide
>  ID                        csvcolumn
>1  1 sender, correct, \n1, y, \n2, y,
>2  2 sender, correct, \n2, n, \n1, n,
>3  3 sender, correct, \n1, n, \n2, y,

, и я хочу, чтобы он выглядел так:

> df_long
  ID  sender  correct
   1     1      y
   1     2      y
   2     2      n
   2     1      n
   3     1      n
   3     2      y

Я могу прочитать столбец csv и сохранить его как новый фрейм данных с

df2 <- read.table (text = df_wide $ csvcolumn, sep = ",", header =TRUE, allowEscapes = TRUE) </p>

но, очевидно, это не включает широкоформатные данные, и я не знаю, какие данные принадлежат к какому идентификатору.

Я надеюсь, что этокак-то можно решить, и я благодарен за вашу помощь.

1 Ответ

0 голосов
/ 11 февраля 2019

Я бы поставил под сомнение введенные здесь данные.Вероятно, уточните в Excel ввод, который имеет больше смысла для R. Однако не всегда возможно ...

Чтобы очистить это, сначала удалите необязательный заголовок для csvcolumn и разбейте на \n символов (необходимоtidyverse!)

library(tidyverse)    
df_n <- df_wide %>% dplyr::mutate(n = gsub("sender, correct, \n", 
                                    "", 
                                    csvcolumn)) %>% 
                    dplyr::select(1,3) %>%
                    tidyr::separate(data=., 
                                    col="n", 
                                    sep="\n",
                                    into=c("s1","c1"))

Затем используйте аналогично вашему read.csv трюку, но с read_csv

df_list <- lapply(df_n, function(f){
                          read_csv(as.vector(f), col_names=F)
                        })

Затем вы можете позвонить rbind, чтобы получить данные вашей анкетыи затем ID на общее количество строк, деленное на длину ID

qdat <- do.call(rbind,df_list[2:length(df_list)]) %>% 
        dplyr::select(1,2) %>% 
        as_tibble() 
df_long <- qdat %>%
           dplyr::mutate(ID = rep(unlist(df_list[[1]]), 
                                  dim(qdat)[1]/dim(df_list[[1]])[1])) %>%
           dplyr::select(ID, sender="X1", correct = "X2")

df_long
# A tibble: 6 x 3
     ID sender correct
  <dbl>  <dbl> <chr>
1     1      1 y
2     2      2 n
3     3      1 n
4     1      2 y
5     2      1 n
6     3      2 y
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...