需要一个 R 函数通过 Y 计数复制 X 数据,其中 X 包含一些重复值
Need an R function to replicate X data by Y counts, where X contains some repeated values
我有一个相当大的数据集 (18,000) 行,其中 2 列不感兴趣。我想将一个 (X) 视为定量值,将另一个 (Y) 视为计数,并根据计数重复 X 数据。由于数据的性质,X 列中有重复值,我只想创建一个包含所有 X 值及其重复测量值的新数据集。我尝试执行以下操作,但它 returns 一个无效的时间参数: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
也许您正在寻找 uncount
?
library(tidyr)
library(dplyr)
df %>%
uncount(count)
这个returns
# 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
当一个或多个 Y
为 NA
(或负数)时,我可以重现该错误:
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
我们可以将NA
替换为0
:
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")
基础 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))
我有一个相当大的数据集 (18,000) 行,其中 2 列不感兴趣。我想将一个 (X) 视为定量值,将另一个 (Y) 视为计数,并根据计数重复 X 数据。由于数据的性质,X 列中有重复值,我只想创建一个包含所有 X 值及其重复测量值的新数据集。我尝试执行以下操作,但它 returns 一个无效的时间参数: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
也许您正在寻找 uncount
?
library(tidyr)
library(dplyr)
df %>%
uncount(count)
这个returns
# 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
当一个或多个 Y
为 NA
(或负数)时,我可以重现该错误:
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
我们可以将NA
替换为0
:
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")
基础 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))