【问题标题】:Split named numeric vector into different elements in R将命名数字向量拆分为 R 中的不同元素
【发布时间】:2021-01-22 09:00:06
【问题描述】:

我在 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_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


    【解决方案1】:

    这是一种基本的 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 
    

    【讨论】:

      【解决方案2】:

      使用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 
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2022-06-15
        • 2019-09-10
        • 1970-01-01
        • 1970-01-01
        • 2014-09-27
        • 1970-01-01
        • 1970-01-01
        • 2019-05-04
        相关资源
        最近更新 更多