如何根据拆分

时间:2017-03-14 17:12:28

标签: r

我有一个如下列表:

list(character(0), c("\r19:0", "5:20", "7:40", "15:60", "21:80", 
"13:100", "17:120", "12:140", "10:160", "8:180"), c("\r6:0", 
"6:20", "11:40", "5:60", "1:80", "2:100", "1:120", "1:140", "2:160", 
"0:180"), "\r", c("\r12:0", "9:20", "34:40", "46:60", "26:80", 
"10:100", "8:120", "6:140", "6:160", "4:180"), c("\r6:0", "14:20", 
"26:40", "37:60", "43:80", "38:100", "51:120", "40:140", "21:160", 
"26:180"), c("\r0:0", "2:30", "22:60", "15:90", "9:120", "1:150", 
"1:180"), c("\r18:0", "14:30", "14:60", "13:90", "13:120", "11:150", 
"11:180"))

我想创建一个数据框,其列名对应于每个冒号后的值,以及每个冒号在该列中删除之前的值,因此最终结果应为:

a0  a20  a30  a40  a60  a80  a90  a100  a120  a140  a150  a160   a180
19   5         7  15    21         13    17    12          10     8
6    6        11   5    1           2    1     1           2      0
12   9        34  46    26         10    8     6           6      4
0        2    22             15          9           1            1
18       14       14         13          13          11           11 

2 个答案:

答案 0 :(得分:1)

L成为输入列表。这里有几种方法。既不使用任何包裹。两者都输出矩阵结果。 (如果重要的是结果是data.frame使用as.data.frame(X)将其转换为一个,其中X是生成的矩阵。)

1)read.dcf 我们删除\ r \ n字符切换冒号前后的数字,只保留那些冒号的字段。将每个列表组件中的所有字段组合成一个字符串,用新行分隔它们,并在末尾添加一个额外的换行符。 s现在是dcf格式的字符向量,因此请使用read.dcf进行读取。接下来将数据转换为数字并对列进行排序。

s <- sapply(L, function(x) { 
  x <- sub("(.*):(.*)", "\\2: \\1", sub("\r", "", x))
  paste(c(grep(":", x, value = TRUE), "\n"), collapse = "\n")
})
m <- read.dcf(textConnection(s))
o <- order(as.numeric(colnames(m)))
array(as.numeric(m), dim(m), dimnames(m))[, o]

结果是这个矩阵:

      0 20 30 40 60 80 90 100 120 140 150 160 180
[1,] 19  5 NA  7 15 21 NA  13  17  12  NA  10   8
[2,]  6  6 NA 11  5  1 NA   2   1   1  NA   2   0
[3,] 12  9 NA 34 46 26 NA  10   8   6  NA   6   4
[4,]  6 14 NA 26 37 43 NA  38  51  40  NA  21  26
[5,]  0 NA  2 NA 22 NA 15  NA   9  NA   1  NA   1
[6,] 18 NA 14 NA 14 NA 13  NA  13  NA  11  NA  11

2)tapply 首先删除垃圾,消除任何\r个字符以及任何不包含冒号的元素。然后形成每个条目的行号和列名,然后使用tapply将它们放在一起,创建与上面相同的矩阵:

# remove junk
L2a <- lapply(L, sub, pattern = "\r", replacement = "") 
L2b <- lapply(L2a, grep, pattern = ":", value = TRUE)
L2c <- Filter(length, L2b)  # keep only entries with positive length

Rows <- rep(seq_along(L2c), lengths(L2c))
Cols <- factor(as.numeric(sub(".*:", "", unlist(L2c))))
Vals <- as.numeric(sub(":.*", "", unlist(L2c)))

tapply(Vals, list(Rows, Cols), c)

答案 1 :(得分:0)

格罗腾迪克答案的另一个版本,但更多的手动是循环所有元素并创建数据框。

因此,您可以执行以下列表<div class="row"> <input type ="text"> <h1> @{{ name }} </h1> </div>

x