代码之家  ›  专栏  ›  技术社区  ›  Joe

使用strsplit()将矢量操纵到数据帧中

r
  •  1
  • Joe  · 技术社区  · 1 年前

    我收到了一些格式非常糟糕的数据,所以我希望将其处理成更好的格式。我在这里的目标是将数据拆分出来,并按位置顺序将其放回数据帧中。例如,这里我有10个数字,然后是一个正斜杠,我希望将其放入一个数据帧中,每个列都指示原始数据中的一个位置,这看起来像问题底部的df,我只是不知道如何从我按位置将数据拆分为df形式的版本中获取。

     mydata
     "/0,2,5,6,2,5,0,0,0,0/0,0,8,1,4,,2,4,0,0/5,6,2,5,0,0,7,8,3,2\"
    
     mydata #step1
     [[1]]
     [1] "0"  "2"   "5"   "6"   "2"   "5"   "0"  "0"    "0"   "0"
    
    [[2]]
     [1] "0"  "0"   "8"   "1"   "4"   "0"   "2"   "4"   "0"   "0"
    
    [[3]]
     [1] "5"  "6"    "2"  "5"   "0"   "0"   "7"   "8"   "3"   "2"
    
    mydf
    p1  p2  p3  p4  p5  p6  p7  p8  p0  p10
    0   2   5    6   2   5   0   0   0   0
    0   0   8    1   4   0   2   4   0   0
    5   6   2    5   0   0   7   8   3   2
    

    很抱歉,这不是措辞最好的问题,可以对原始数据做任何你想做的事情,不必拆分。我只是觉得这是一个很好的开始方式

    1 回复  |  直到 1 年前
        1
  •  2
  •   r2evans    1 年前

    假设您的 mydata 应该是正斜杠,我们可以用换行符替换正斜杠,并使用 read.csv .

    mydata <- "/0,2,5,6,2,5,0,0,0,0/0,0,8,1,4,,2,4,0,0/5,6,2,5,0,0,7,8,3,2/"
    dat <- read.csv(text = gsub("/", "\n", mydata), header = FALSE)
    dat
    #   V1 V2 V3 V4 V5 V6 V7 V8 V9 V10
    # 1  0  2  5  6  2  5  0  0  0   0
    # 2  0  0  8  1  4 NA  2  4  0   0
    # 3  5  6  2  5  0  0  7  8  3   2
    

    你展示了 0 在中间,目前 NA (由于中的空单元格 mydata ),我们可以通过以下方式轻松解决:

    dat[] <- lapply(dat, function(z) ifelse(is.na(z), 0, z))
    dat
    #   V1 V2 V3 V4 V5 V6 V7 V8 V9 V10
    # 1  0  2  5  6  2  5  0  0  0   0
    # 2  0  0  8  1  4  0  2  4  0   0
    # 3  5  6  2  5  0  0  7  8  3   2
    

    如果你真的想使用 strsplit 然而,我们可以使用

    out <- strsplit(mydata, "/")[[1]] |>
      strsplit(",") |>
      do.call(rbind, args = _) |>
      as.data.frame()
    out
    #   V1 V2 V3 V4 V5 V6 V7 V8 V9 V10
    # 1  0  2  5  6  2  5  0  0  0   0
    # 2  0  0  8  1  4     2  4  0   0
    # 3  5  6  2  5  0  0  7  8  3   2
    

    它现在是一个字符串框架。我们可以进行与上述类似的后期处理( out[] <- lapply(...) )将空/null转换为 0 .