【问题标题】:Writing a function in in R在 R 中编写函数
【发布时间】:2020-03-15 21:22:01
【问题描述】:

我正在做一个练习来练习写作功能。

在编写重现table 函数输出的函数之前,我试图找出通用代码。到目前为止,我有以下内容:

set.seed(111) 
vec <- as.integer(runif(10, 5, 20)) 

x <- sort(unique(vec))

for (i in x) {
   c <- length(x[i] == vec[i]) 
   print(c) 
}

但这给了我以下输出:

[1] 1
[1] 1
[1] 1
[1] 1
[1] 1
[1] 1
[1] 1
[1] 1
[1] 1

我认为我在循环中的子集设置不正确。我一直在看视频,但我不太确定我哪里出错了。希望有任何见解!

谢谢!

【问题讨论】:

  • 作弊:"names&lt;-"(tabulate(vec), sort(unique(vec))),作弊是因为“制表是 table 函数的主力。”,请参阅 ?tabulate

标签: r function loops


【解决方案1】:

我们可以将sum逻辑向量连接到count

count <- c()
for(number in x) count <- c(count, sum(vec == number)) 
count
#[1] 3 1 4 1 5 4 3 2 7

在 OP 的 for 循环中,它循环的是“x”值而不是“x”序列

如果我们这样做

for(number in x) count <- c(count, length(vec[vec == number])) 

它应该也可以工作

【讨论】:

  • @user12310746 在您的代码中,“count”对象似乎是动态创建的。并且它在每个循环中都会更新,因此长度为 1 和。值在每个循环中被替换。因此,如果您检查“计数”,它将是最后一次迭代的值。否则,您也可以创建一个count &lt;- numeric(length(x)),然后循环“x”序列,即for(i in seq_along(x)) count[i] &lt;- sum(vec == x[i1])
【解决方案2】:

您可以尝试sapply + setNames 来达到与table 相同的结果,即,

count <- sapply(x, function(k) setNames(sum(k==vec),k))

count <- sapply(x, function(k) setNames(length(na.omit(match(vec,k))),k))

这样

> count
1 2 3 4 5 6 7 8 9 
3 1 4 1 5 4 3 2 7 

【讨论】:

    【解决方案3】:

    这是一个不使用unique 并且只通过向量一次的解决方案(如果只有R 使用for 循环很快!):

    count = list()
    for (i in vec) {
      val = as.character(i)
      if (is.null(count[[val]]))
        count[[val]] = 1
      else
        count[[val]] =  count[[val]] + 1
    }
    unlist(count)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-03-06
      • 2021-03-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-04-04
      相关资源
      最近更新 更多