将具有连接索引和值的字符串转换为值向量

时间:2016-01-16 06:00:10

标签: r

我有一个这样的数据框:

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)   

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
  • 拆分,的每个元素
  • 然后我们再次使用:作为分隔符进行拆分;
  • 我们创建一个长度为6的数字向量;
  • 我们最终按照描述的逻辑填充了这些值。

答案 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作为listnumeric向量重新导入,请执行以下操作:

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 lengthmax索引的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