【问题标题】:Is there a function in R similar to the COUNTIF in Excel? [duplicate]R中是否有类似于Excel中的COUNTIF的函数? [复制]
【发布时间】:2021-02-02 20:52:06
【问题描述】:

我有超过 1000000 个单元格的数据集,我只需要基于站点名称使用 R 的 1 年内超过 20 天的数据。

这是原始数据集:

我可以在excel中使用'count if'函数来计算一个月有多少天,但我发现它非常慢并且会导致问题。这是我在 Excel 上使用的公式。

我在 Excel 上的代码:

对于我的基本问题,我很抱歉,但我希望有人可以帮助我解决这个问题。

【问题讨论】:

  • 如果您包含一个简单的reproducible example,其中包含可用于测试和验证可能解决方案的示例输入和所需输出,则更容易为您提供帮助。我们不需要你所有的真实数据,只需要一些可以测试的东西。请不要发布数据或代码的图像。我们不能复制/粘贴这些来编辑或导入它们。
  • 你用的是哪个版本的excel?如果你有Office365,那么它可以显着加速。
  • 这只是df %>% count(site, Year, Month)吗?
  • 谢谢!这是我第一次在这里发布东西,下次肯定会包括样本!

标签: r excel data-cleaning countif


【解决方案1】:

同意评论 - 您需要创建一个可重现的示例。 Excel 中的任何东西都可以在 R 中做得更好(嗯,几乎任何东西) 可能的方法很多 - 尝试如下分组

df = data.frame(matrix(rnorm(40), nrow=10))
X0 <-sample(c(rep("A",3),rep("B",3),rep("C",4)), 10)
df$X0 <- x0
df        # this is a simulated dataset
           X1          X2         X3          X4 X0
1  -0.1203975  0.40176671 -0.1441914 -1.27356811  B
2  -1.2945289  0.34813784  0.3233932  0.80881055  B
3   1.0095911  0.69446583 -0.4377096 -1.41026705  A
4  -0.2547187  1.04914805 -0.8120526 -0.58734365  C
5  -0.1732585 -0.16422459 -0.8195833  0.44932410  A
6   0.5599036 -0.79013084 -0.9540998 -0.03861297  C
7  -0.5338999  0.03481498  0.3663478  0.44230402  B
8   0.9837636  0.98619889 -0.4901891  0.45207061  C
9   0.7892718 -0.23403087 -0.1102857  0.79010878  A
10  0.9392468  0.54867442 -0.4180297 -0.40482425  C


# Next, we count/index by X0 ~ you will need to do this by "site" /your choice
library(dplyr)
df1 <- df %>%
  group_by(X0) %>%
  add_count
df1

# A tibble: 10 x 6
# Groups:   X0 [3]
       X1      X2     X3      X4 X0        n
    <dbl>   <dbl>  <dbl>   <dbl> <chr> <int>
 1 -0.120  0.402  -0.144 -1.27   B         3
 2 -1.29   0.348   0.323  0.809  B         3
 3  1.01   0.694  -0.438 -1.41   A         3
 4 -0.255  1.05   -0.812 -0.587  C         4
 5 -0.173 -0.164  -0.820  0.449  A         3
 6  0.560 -0.790  -0.954 -0.0386 C         4
 7 -0.534  0.0348  0.366  0.442  B         3
 8  0.984  0.986  -0.490  0.452  C         4
 9  0.789 -0.234  -0.110  0.790  A         3
10  0.939  0.549  -0.418 -0.405  C         4
# After the above, you can sort and cut OR filter your count variable 
by 20 or any such value! Here, rows with n >3 are subset. Done.     

df2 <- df1[df1$n>3,]
df2
# A tibble: 4 x 6
# Groups:   X0 [1]
      X1     X2     X3      X4 X0        n
   <dbl>  <dbl>  <dbl>   <dbl> <chr> <int>
1 -0.255  1.05  -0.812 -0.587  C         4
2  0.560 -0.790 -0.954 -0.0386 C         4
3  0.984  0.986 -0.490  0.452  C         4
4  0.939  0.549 -0.418 -0.405  C         4

【讨论】:

  • 感谢您的帮助!当然,下次我会附上样品。你的回答对我很有帮助!
  • @Gerry Andhika:很高兴听到这个消息! ....@Amar - 回答中的有用见解,刚刚投票!
【解决方案2】:

如果我理解正确,您需要每个站点的天数。如果您的数据如下所示:

site = c("a", "b", "c", "a", "b", "c", "a", "b", "c")
year = c(1991, 1992, 1993, 1991, 1992, 1993, 1991, 1992, 1993)
month = c(1, 1, 4, 4, 1, 1, 4, 4, 1)
my_data = data.frame(site, year, month)

您可以使用包dplyr(通过install.packages(dplyr)安装):

library(dplyr)
my_data %>% group_by(site) %>% count(year, month)

输出:

# A tibble: 6 x 4
# Groups:   site [3]
  site   year month     n
  <chr> <dbl> <dbl> <int>
1 a      1991     1     1
2 a      1991     4     2
3 b      1992     1     2
4 b      1992     4     1
5 c      1993     1     2
6 c      1993     4     1

您可以使用 dput 发布您的代码的 sn-p:

dput(my_data)
structure(list(site = c("a", "b", "c", "a", "b", "c", "a", "b", 
"c"), year = c(1991, 1992, 1993, 1991, 1992, 1993, 1991, 1992, 
1993), month = c(1, 1, 4, 4, 1, 1, 4, 4, 1)), class = "data.frame", row.names = c(NA, 
-9L))

然后其他人可以使用上述代码并复制您的数据。不必是所有数据,只需前 10 行即可。

【讨论】:

    【解决方案3】:

    我建议您创建一个新列来连接 B、J 和 K 列,然后将列粘贴为值。之后,您可以简单地使用 countif 代替 countifs。

    【讨论】:

    • 这不是答案。这可能是一条评论。
    • 我认为这在 excel 中是一个很好的答案,但 OP 想要一个 r 代码
    猜你喜欢
    • 2022-12-10
    • 2022-01-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-07
    • 2017-05-29
    • 2015-05-20
    相关资源
    最近更新 更多