在 R 中的循环中使用"count"函数



我对R很陌生,我一直在网上学习可用的资源。我遇到了这个问题,我有一个向量(a),它有变量"1","2"one_answers"3"。我想用计数函数来生成一个新的df包含每个变量的类别和频率。我想在循环中使用的函数是this

b <- count(mydata, var1)

但是,当我使用下面的循环时;

for (i in (a)) {
'j' <- count(mydata[, i])
print (j)
}

循环发生了,但是在j上保存的频率只是分类变量var 3的频率。有人能帮我破解这个密码吗?

TIA !

在R中通常有比使用循环更好的方法来处理数据。在您的特殊情况下,"直接"的方法是失败的,因为"整洁世界"的概念是将数据以整洁的格式保存(我强烈建议您阅读本文;它有点长,但它的解释对于任何类型的数据处理都是至关重要的,甚至超越了宇宙。但是(从代码的角度来看)您的数据分布在多个列(宽格式)而不是在单个列(长格式)中。

另一个问题是count(像许多其他的tidyverse函数一样)期望一个未求值的列名。它不通过变量接受列名。Akrun的答案展示了如何解决这个问题(使用整洁的求值和bang-bang操作符),但这是一个在这里没有必要的解决方案。

通常的解决方案不是使用循环,而是首先要求您使用pivot_longer将数据转换为长格式。

之后,您可以对您的数据执行单个count:

result <- mydata %>%
pivot_longer(all_of(a), names_to = 'Var', values_to = 'Value') %>%
count(Var, Value)

关于您当前方法的一些评论:

  1. 小心变量名:什么是i,ja?使用简洁但具有描述性的变量名。有一些约定使用ij,但是,如果这样的话,它们几乎完全引用索引变量在vector索引的循环中。因此,以不同的方式使用它们是相当误导的。
  2. 在R中,通常不需要在变量名周围加上括号(除非该名称是函数调用的唯一参数)。也就是说,用for (i in a)代替for (i in (a))是比较常规的。
  3. 不要在变量名周围加引号!R碰巧接受代码'j' <- …,但由于引号通常表示字符串字面量,它在这里的使用令人难以置信的误导,而且没有达到目的。

最新更新