系统地用变量名的一部分替换相关R矢量的第一个元素

时间:2015-03-16 15:00:44

标签: r grep

我有一个数据框,其中关联的“名称”向量的第一个元素与后续命名的数字向量相关。我试图用相关名称向量的第一个元素替换无意义的数字。

以下是一个示例数据框:

df <- data.frame(data.0.name = c("A", "A", "A"), data.0.one_minute_ago =     c(1,2,1), data.0.one_hour_ago = c(2,2,3), 
                 data.1.name = c("B", "B", "B"), data.1.one_minute_ago =     c(3,3,2), data.1.one_hour_ago = c(5,6,2))`

每个number.name向量与构造(在这种情况下为A或B)相关联,并且每个number.time与时间维度相关联。因此,data.0.one_minute_ago实际上是您拥有one_minute_ago的A的数量。

我想做什么(因为我有一个包含大量转换的大型数据集)是用number.dimension替换construct.dimension,当然为每个{{1}做一次从0:9

我已经写了一些grep代码来开始这项任务,但无济于事(我坚持在number.

之后保留所有内容
number.

此处grep( "data.[0-9].name" ,names(df), perl=TRUE) as.character(df[1, 1]) as.character(df[1, 4]) as.character(names(df[2])) as.character(names(df[3])) as.character(names(df[5])) as.character(names(df[6])) df.1 <- (df[1, grep( "data.[0-9].name" ,names(df))]) df.1 <- (df[1, grep( "data.[0-9].name" ,names(df))]) df.1 <- data.frame(lapply(df.1, as.character), stringsAsFactors=FALSE) constructs <- as.character(df.1[1,c(1:2)]) 的第1和第2个元素分别是与constructs / 0.name0.dimension / 1.name相关联的构造。

1.dimension

从那里开始,我相当肯定代码会涉及一些constructs [1] constructs [2] 但不确定从哪里开始。

任何和所有帮助表示赞赏。

编辑:这是所需的变量名输出:只需更改变量名(当然还保留与变量名相关的值:

names(df)[] <-

编辑2:在我的真实数据集中,每个维度的重复次数(即one_minute_ago,one_hour_ago,one_day_ago)可以在不同的构造中变化(即,一个构造的两个维度和另一个构造的3个维度,另一个构造的3个维度)。我希望解决方案考虑到这一点。

这是一个经过修改的样本数据集,以反映这一微妙之处:

data.A.name   data.A.one_minute_ago    data.A.one_hour_ago    data.B.name    data.B.one_minute_ago    data.B.one_hour_ago

2 个答案:

答案 0 :(得分:3)

我们创建了一个分组&#39; indx&#39;基于&#39;数字&#39;在列名称中。 split列名称基于&#39; indx&#39; (&#39; LST&#39)。从名称为&#39;的列中获取一个元素作为后缀(&#39; r1&#39;)。使用&#39; Map&#39;并gsub替换&#39;号码&#39;在每个元素中都有&#39; lst&#39;用&#39; r1&#39;。

 indx <- gsub('[^0-9]+', '', names(df))
 lst <- split(names(df), indx)
 r1 <- as.character(unlist(df[1,grep('name', names(df))]))
 lst2 <- Map(function(x,y) gsub('[0-9]+', y, x), lst, r1)
 names(df) <- unsplit(lst2, indx)
 names(df)
 # [1] "data.A.name"           "data.A.one_minute_ago" "data.A.one_hour_ago"  
 #[4] "data.B.name"           "data.B.one_minute_ago" "data.B.one_hour_ago"  
 #[7] "data.C.name"           "data.C.one_minute_ago" "data.C.one_hour_ago"  
 #[10] "data.C.one_day_ago"   

答案 1 :(得分:1)

我认为这有效:

library(stringr)
splits        <- str_split(names(df), "\\.")
trailing_name <- sapply(splits, "[[", 3)
constructs    <- rep(constructs, each = 3)
constructs
# [1] "A" "A" "A" "B" "B" "B"
names(df)     <- str_c("data", constructs, trailing_name, sep=".")
names(df)
# [1] "data.A.name"           "data.A.one_minute_ago" "data.A.one_hour_ago"   "data.B.name"          
# [5] "data.B.one_minute_ago" "data.B.one_hour_ago"