繁体   English   中英

将命名数字向量拆分为 R 中的不同元素

[英]Split named numeric vector into different elements in R

我在 R 中有一个命名数字向量,其中有超过 2000 个命名数字。 我想将数字大于 1 的每个元素拆分为数字表示的元素数量,最后只有数字 1。但重要的是名称也更改为在我的 output 中表示。

输入:

obj<- c(3,1,1,1,6,1,1,1,1,1,1,1,1,3)
names(obj)<- c("V4","V10","V12","V15","V16","V20","V21","V22","V23","V36","V39","V40","V41","V42")

>obj
   V4   V10   V12   V15   V16   V20   V21   V22   V23   V36   V39   V40   V41   V42 
    3     1     1     1     6     1     1     1     1     1     1     1     1     3

Output:

obj_out<- c(1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,3)
    names(obj_out)<- c("V4_1","V4_2","V4_3","V10","V12","V15","V16_1","V16_2","V16_3","V16_4","V16_5","V16_6","V20","V21","V22","V23","V36","V39","V40","V41","V42_1","V42_2","V42_3")

 > obj_out
 V4_1  V4_2  V4_3   V10   V12   V15 V16_1 V16_2 V16_3 V16_4 V16_5 V16_6   V20   V21 
    1     1     1     1     1     1     1     1     1     1     1     1     1     1 
  V22   V23   V36   V39   V40   V41 V42_1 V42_2 V42_3 
    1     1     1     1     1     1     1     1     1 

我已经有一个代码,但它以全新的方式命名序列,从 V1 开始:

obj_out<- paste0("V",rep(seq_along(obj_out), obj_out), "_", sequence(obj_out))

这是一种基本的 R 方法:

#Repeat each value in obj, obj number of times
res <- rep(obj, obj)
#Change all values to 1.
res[] <- 1
#Change the names
names(res) <- ave(names(res), names(res), FUN = function(x) 
                  if(length(x) == 1) x else paste(x, seq_along(x), sep = '_'))
res

# V4_1  V4_2  V4_3   V10   V12   V15 V16_1 V16_2 V16_3 V16_4 V16_5 V16_6 
#    1     1     1     1     1     1     1     1     1     1     1     1 
#  V20   V21   V22   V23   V36   V39   V40   V41 V42_1 V42_2 V42_3 
#    1     1     1     1     1     1     1     1     1     1     1 

利用purrr的一种选择可能是:

imap(obj[obj > 1], ~ set_names(rep(1, .x), paste(.y, 1:.x, sep = "_"))) %>%
 reduce(c) %>%
 c(., obj[obj == 1])

 V4_1  V4_2  V4_3 V16_1 V16_2 V16_3 V16_4 V16_5 V16_6 V42_1 V42_2 V42_3   V10   V12 
    1     1     1     1     1     1     1     1     1     1     1     1     1     1 
  V15   V20   V21   V22   V23   V36   V39   V40   V41 
    1     1     1     1     1     1     1     1     1 

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM