【问题标题】:How to extract csv column from dataframe and combine it with existing dataframe如何从数据框中提取 csv 列并将其与现有数据框结合
【发布时间】:2019-07-04 19:32:13
【问题描述】:

我有一个数据框,其中包含来自宽格式调查问卷的数据。但是一列包含压缩的实验数据,其中包含长格式的 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

但显然这不包括宽格式数据,我不知道哪些数据属于哪个ID。

我希望这可以通过某种方式解决,感谢您的帮助。

【问题讨论】:

    标签: r csv read.table read.csv


    【解决方案1】:

    我会质疑这里使用的输入。可能在 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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-10-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-09-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多