【问题标题】:Need an R function to replicate X data by Y counts, where X contains some repeated values需要一个 R 函数按 Y 计数复制 X 数据,其中 X 包含一些重复值
【发布时间】:2022-01-08 09:56:35
【问题描述】:

我有一个相当大的数据集 (18,000) 行,其中 2 列不感兴趣。我想将一个(X)作为定量值,另一个(Y)作为计数,并根据计数重复 X 数据。由于数据的性质,X 列中有重复值,我只想创建一个包含所有 X 值及其重复测量的新数据集。我尝试过执行以下操作,但它返回一个无效的时间参数:rep, df$X, df$Y

我不确定为什么会发生此错误,也不知道从哪里开始。任何帮助表示赞赏。下面是我的数据的一个小样本。

8.76    3
24.69   0
6.24    2
1.17    0
6.54    3
10.29   0
11.04   1
16.71   1

【问题讨论】:

  • 我再次阅读了您的问题,现在我不明白您要做什么。您的预期输出如何?
  • (我同意。)请发布来自dput(head(df,10)) 的输出,也许df 有一些不明显的问题。
  • 啊,我明白了……你的数据中可能有一个NA

标签: r histogram rep


【解决方案1】:

当一个或多个YNA(或负数)时,我可以重现该错误:

df
#       X  Y
# 1  8.76  3
# 2 24.69 NA
# 3  6.24  2
# 4  1.17  0
# 5  6.54  3
# 6 10.29  0
# 7 11.04  1
# 8 16.71  1
rep(df$X, df$Y)
# Error in rep(df$X, df$Y) : invalid 'times' argument
df$Y[2] <-  -1
rep(df$X, df$Y)
# Error in rep(df$X, df$Y) : invalid 'times' argument

我们可以用0替换NA

rep(df$X, pmax(0, df$Y, na.rm = TRUE))
#  [1]  8.76  8.76  8.76  6.24  6.24  6.54  6.54  6.54 11.04 16.71

数据

df <- structure(list(X = c(8.76, 24.69, 6.24, 1.17, 6.54, 10.29, 11.04, 16.71), Y = c(3L, NA, 2L, 0L, 3L, 0L, 1L, 1L)), row.names = c(NA, -8L), class = "data.frame")

【讨论】:

  • 哇。我觉得很笨。我的 DF 的最后一行包含所有 NA 值。这解决了它!谢谢!
  • 我们都去过那里,不用担心。由于您是新人......当您对答案解决您的问题感到满意时,请accept it(出于多种原因)。不急于这样做,这是一种常见的策略(有一些类型的问题)等待一个更令人愉快(或更快或更优雅或......)的答案,也许一三天。但请记住回来接受这个或其他首选答案之一。谢谢!
  • 我接受了它,因为它解决了我的问题。前几天刚开始学R,还有很长的路要走。
【解决方案2】:

也许您正在寻找uncount

library(tidyr)
library(dplyr)

df %>% 
  uncount(count)

返回

# A tibble: 10 x 1
   value
   <dbl>
 1  8.76
 2  8.76
 3  8.76
 4  6.24
 5  6.24
 6  6.54
 7  6.54
 8  6.54
 9 11.0 
10 16.7 

【讨论】:

    【解决方案3】:

    一个基本的 R 替代方案:

    transform(df[rep(seq_len(nrow(df)), df$y),], y = sequence(df$y))
    

    输出:

            x y
    1    8.76 1
    1.1  8.76 2
    1.2  8.76 3
    3    6.24 1
    3.1  6.24 2
    5    6.54 1
    5.1  6.54 2
    5.2  6.54 3
    7   11.04 1
    8   16.71 1
    

    数据:

    df <- structure(list(x = c(8.76, 24.69, 6.24, 1.17, 6.54, 10.29, 11.04, 
    16.71), y = c(3L, 0L, 2L, 0L, 3L, 0L, 1L, 1L)), class = "data.frame", row.names = c(NA, 
    -8L))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-05-07
      • 2021-08-10
      • 2011-04-18
      • 1970-01-01
      • 1970-01-01
      • 2022-06-22
      • 1970-01-01
      相关资源
      最近更新 更多