gpt4 book ai didi

复制data.frame的每一行并指定每行的复制次数?

转载 作者:行者123 更新时间:2023-12-04 12:29:36 25 4
gpt4 key购买 nike

我正在用 R 编程,但遇到以下问题:

我有一个数据字符串 jb,它很长。这是它的一个简单版本:

jb:    a     b     frequency               jb.expanded: a    b   
5 3 2 5 3
5 7 1 5 3
9 1 40 5 7
12 4 5 9 1
12 5 13 9 1
... ...

我想复制行,复制的频率是列频率。这意味着,第一行被复制两次,第二行被复制一次,依此类推。我已经用代码解决了这个问题
jb.expanded <- jb[rep(row.names(jb), jb$freqency), 1:2] 

现在问题来了:

每当频率角中的任何数字大于 10 时,复制列的数量就是错误的。例如:
Frequency: 43 --> 14 columns
40 --> 13 columns
13 --> 11 columns
14 --> 12 columns

你能帮助我吗?我不知道如何解决这个问题,我也无法在互联网上找到任何东西。

谢谢你的帮助!

最佳答案

更新

重新审视这个问题时,我有一种感觉,@Codoremifa 假设您的“频率”列可能是 factor 是正确的。 .

这是一个例子,如果是这样的话。它与您的实际数据不匹配,因为我不知道您的数据集中还有哪些其他级别。

mydf$F2 <- factor(as.character(mydf$frequency))
## expandRows(mydf, "F2")
mydf[rep(rownames(mydf), mydf$F2), ]
# a b frequency F2
# 1 5 3 2 2
# 1.1 5 3 2 2
# 1.2 5 3 2 2
# 2 5 7 1 1
# 3 9 1 40 40
# 3.1 9 1 40 40
# 3.2 9 1 40 40
# 3.3 9 1 40 40
# 4 12 4 5 5
# 4.1 12 4 5 5
# 4.2 12 4 5 5
# 4.3 12 4 5 5
# 4.4 12 4 5 5
# 5 12 5 13 13
# 5.1 12 5 13 13

嗯。对我来说,这看起来不像 61 行。为什么不?因为 rep使用 factor 下的数值,在这种情况下与显示的值完全不同:
as.numeric(mydf$F2)
# [1] 3 1 4 5 2

要正确转换它,您需要:
as.numeric(as.character(mydf$F2))
# [1] 2 1 40 5 13

原答案

不久前,我编写了一个函数,它更像是对@Simono101 答案的概括。该函数如下所示:
expandRows <- function(dataset, count, count.is.col = TRUE) {
if (!isTRUE(count.is.col)) {
if (length(count) == 1) {
dataset[rep(rownames(dataset), each = count), ]
} else {
if (length(count) != nrow(dataset)) {
stop("Expand vector does not match number of rows in data.frame")
}
dataset[rep(rownames(dataset), count), ]
}
} else {
dataset[rep(rownames(dataset), dataset[[count]]),
setdiff(names(dataset), names(dataset[count]))]
}
}

出于您的目的,您可以使用 expandRows(mydf, "frequency")
head(expandRows(mydf, "frequency"))
# a b
# 1 5 3
# 1.1 5 3
# 2 5 7
# 3 9 1
# 3.1 9 1
# 3.2 9 1

其他选项是将每一行重复相同的次数:
expandRows(mydf, 2, count.is.col=FALSE)
# a b frequency
# 1 5 3 2
# 1.1 5 3 2
# 2 5 7 1
# 2.1 5 7 1
# 3 9 1 40
# 3.1 9 1 40
# 4 12 4 5
# 4.1 12 4 5
# 5 12 5 13
# 5.1 12 5 13

或者指定每行重复次数的向量。
expandRows(mydf, c(1, 2, 1, 0, 2), count.is.col=FALSE)
# a b frequency
# 1 5 3 2
# 2 5 7 1
# 2.1 5 7 1
# 3 9 1 40
# 5 12 5 13
# 5.1 12 5 13

注意所需的 count.is.col = FALSE最后两个选项中的论点。

关于复制data.frame的每一行并指定每行的复制次数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19518728/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com