我有一个这样的数据框:
v2 v3
1.000 2:3,3:2,5:2,
2.012 1:5,2:4,6:3,
第二列v3由“索引值”对组成,每对由,
分隔。
在每个'index-value'对中,:
之前的数字是向量索引。 :
之后的数字是相应的值。例如。在第一行中,矢量索引是2,3和5,相应的值是3,2和2.
字符串中未表示的索引在结果向量中的值应为0。
我希望将'index-value'向量转换为值向量。
因此,对于预期结果之上的两个字符串是:
v2 v3
1.000 c(0,3,2,0,2,0)
2.012 c(5,4,0,0,0,3)
答案 0 :(得分:4)
我们使用data.table
包只是为了使用它的tstrsplit
函数。它删除了一个中间步骤。试试这个:
require(data.table)
df$v3<-lapply(
lapply(strsplit(as.character(df$v3),",",fixed=TRUE),tstrsplit,":"),
function(x) {res<-numeric(6);res[as.numeric(x[[1]])]<-as.numeric(x[[2]]);res})
# v2 v3
#1 1.000 0,3,2,0,2,0
#2 2.012 5,4,0,0,0,3
v3
),
的每个元素
:
作为分隔符进行拆分; 答案 1 :(得分:1)
我建议采用类似于@nicola建议的方法,但是,为了好玩,这里有另一种选择。
使用read.dcf
,用于读取“tag:value”类型数据。要获取所有“标记”,请使用fields
参数。您在对@nicola的评论中将此指定为1:6。此外,您需要使用换行符("\n"
)替换“,”。
我们会将所有这些内容存储在一个字符串中,以便deparse
+ textConnection
will be able to handle it。这个例子没有必要,但以防万一......
str <- gsub(",", "\n", mydf$v3)
x <- read.dcf(textConnection(str), fields = as.character(1:6))
x <- replace(x, is.na(x), 0)
x
# 1 2 3 4 5 6
# [1,] "0" "3" "2" "0" "2" "0"
# [2,] "5" "4" "0" "0" "0" "3"
要将data.frame
作为list
个numeric
向量重新导入,请执行以下操作:
mydf$v3_l <- lapply(1:nrow(x), function(y) as.numeric(x[y, ]))
以下是生成的str
:
str(mydf)
'data.frame': 2 obs. of 3 variables:
$ v2 : num 1 2.01
$ v3 : chr "2:3,3:2,5:2," "1:5,2:4,6:3,"
$ v3_l:List of 2
..$ : num 0 3 2 0 2 0
..$ : num 5 4 0 0 0 3
答案 2 :(得分:0)
这是另一种仅使用base
函数的方法。
首先,字符串按strsplit
或:
拆分(,
)。奇数位置处的元素对应于索引,甚至位置对应于值。我们预先分配numeric
length
个max
索引的lapply
向量。
在x[c(FALSE, TRUE)]
循环中,我们将分裂向量的值(即偶数元素; vec
)分配给索引处的pre-alloctad向量x[c(TRUE, FALSE)]
(即分裂向量的奇数元素; l <- strsplit(df$v3, "[:|,]")
vec <- numeric(length = max(as.integer(unlist(l)[c(TRUE, FALSE)])))
df$v3 <- lapply(l, function(x){
x <- as.numeric(x)
vec[x[c(TRUE, FALSE)]] <- x[c(FALSE, TRUE)]
vec
})
df
# v2 v3
# 1 1.000 0, 3, 2, 0, 2, 0
# 2 2.012 5, 4, 0, 0, 0, 3
)。
.data
.text
.global main
main:
movl $4,%eax
movl $1,%ebx
movl $53,%ecx //'5'
movl $4,%edx
int $0x80
movl $1,%eax
movl $0,%ebx
int $0x80