我有一个数据框,其中关联的“名称”向量的第一个元素与后续命名的数字向量相关。我试图用相关名称向量的第一个元素替换无意义的数字。
以下是一个示例数据框:
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.name
和0.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
答案 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"