我有一个如下列表:
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
答案 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