【问题标题】:Replace corresponding parts of one array with another array in R用R中的另一个数组替换一个数组的相应部分
【发布时间】:2016-07-21 22:25:02
【问题描述】:

我有一个数组/命名向量,如下所示:

d  f  g
1  2  3

我想填补空位,意思是我想要这个:

a  b  c  d  e  f  g
0  0  0  1  0  2  3

有没有一种优雅的方式来做到这一点,而不必编写循环和条件?在我的实际问题中,不是 abcd 作为我的数组名称,而是数字。不确定这是否会有所作为。对于可重复的示例,图形字母更容易理解。

【问题讨论】:

  • 您是否有理由不想为此使用循环?一个简单的循环可以非常优雅地做到这一点。
  • 如果这不代表您的实际数据,那么我认为您应该将其更改为代表真实数据,以免在开始发布答案后出现进一步的问题。

标签: arrays r sorting


【解决方案1】:

数据

x <- c(d=1L,f=2L,g=3L);
x;
## d f g
## 1 2 3

解决方案 1:首先将新名称匹配到 x 并提取值,然后将 NA 替换为零。

x <- setNames(x[match(letters[1:7],names(x))],letters[1:7]);
x[is.na(x)] <- 0L;
x;
## a b c d e f g
## 0 0 0 1 0 2 3

解决方案 2: 单行,使用 match()nomatch 参数。

setNames(c(x,0L)[match(letters[1:7],names(x),nomatch=length(x)+1L)],letters[1:7]);
## a b c d e f g
## 0 0 0 1 0 2 3

【讨论】:

    【解决方案2】:

    创建一个包含最终名称的向量 nms,然后使用 sapply 从它创建一个命名的零向量,并将与输入名称对应的元素替换为输入值。

    v <- c(d = 1, f = 2, g = 3) # input
    
    nms <- letters[letters <= max(names(v))] # names on output vector, i.e. letters[1:7]
    replace(sapply(nms, function(x) 0), names(v), v) ##
    

    给予:

    a b c d e f g 
    0 0 0 1 0 2 3 
    

    如果在您的实际向量中名称不是字母,那么您只需自己设置nms。例如,nms &lt;- c("dogs", "cats", "d", "elephants", "f", "g") 将与上面标有 ## 的同一行一起使用。

    2) 另一种方法是将上面标记为## 的行替换为:

    unlist(modifyList(as.list(setNames(numeric(length(nms)), nms)), as.list(v)))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-12-21
      • 1970-01-01
      • 2017-08-27
      • 2019-07-29
      相关资源
      最近更新 更多