Ale*_*lor 3 replication r dataframe
我在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
... ...
Run Code Online (Sandbox Code Playgroud)
我想复制行,复制的频率是列频率.这意味着,第一行被复制两次,第二行被复制一次,依此类推.我已经用代码解决了这个问题
jb.expanded <- jb[rep(row.names(jb), jb$freqency), 1:2]
Run Code Online (Sandbox Code Playgroud)
现在问题是:
每当频率角中的任何数字大于10时,复制列的数量都是错误的.例如:
Frequency: 43 --> 14 columns
40 --> 13 columns
13 --> 11 columns
14 --> 12 columns
Run Code Online (Sandbox Code Playgroud)
你能帮助我吗?我不知道如何解决这个问题,我也无法在互联网上找到任何东西.
谢谢你的帮助!
在重新审视这个问题时,我感觉@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
Run Code Online (Sandbox Code Playgroud)
嗯.对我来说,这看起来不像61行.为什么不?因为rep使用了底层的数值factor,这在这种情况下与显示的值完全不同:
as.numeric(mydf$F2)
# [1] 3 1 4 5 2
Run Code Online (Sandbox Code Playgroud)
要正确转换它,您需要:
as.numeric(as.character(mydf$F2))
# [1] 2 1 40 5 13
Run Code Online (Sandbox Code Playgroud)
不久前我写了一个函数,它更像是对@ 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]))]
}
}
Run Code Online (Sandbox Code Playgroud)
为了您的目的,您可以使用 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
Run Code Online (Sandbox Code Playgroud)
其他选项是重复每一行相同的次数:
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
Run Code Online (Sandbox Code Playgroud)
或者指定重复每行多少次的向量.
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
Run Code Online (Sandbox Code Playgroud)
请注意count.is.col = FALSE最后两个选项中的必需参数.