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

将命名的数值向量拆分为R中的不同元素,r,R,我在R中有一个命名数字向量,有2000多个命名数字。我想将数字大于1的每个元素拆分为数字所指示的元素数,最后只包含数字1。但重要的是,也要按照输出中的指示更改名称 输入: 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&q

我在R中有一个命名数字向量,有2000多个命名数字。我想将数字大于1的每个元素拆分为数字所指示的元素数,最后只包含数字1。但重要的是,也要按照输出中的指示更改名称

输入:

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

obj这里有一个基本的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 
#重复obj、obj中的每个值数次

res利用
purr
的一个选项可以是:

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 
#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 
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