gpt4 book ai didi

在 R 中使用 for 循环记录分层数据

转载 作者:行者123 更新时间:2023-12-02 03:42:02 24 4
gpt4 key购买 nike

我有一个经常遇到的问题,我需要一种更有效的处理方式。我在下面发布了一个困惑的解决方案。

首先,我将生成一些与我的数据集类似的示例数据。

a <- c(1, 2, 2, 2, 3, 3)
b <- c("10/12", "10/12", "10/12", "10/13", "10/12", "10/12")
c <- c("c", "c", "pv", "c", "c", "c")
data <- matrix(NA, nrow = 6, ncol = 3)
data[,1] <- a
data[,2] <- b
data[,3] <- c

data

[,1] [,2] [,3]
[1,] 1 10/12 c
[2,] 2 10/12 c
[3,] 2 10/12 pv
[4,] 2 10/13 c
[5,] 3 10/12 c
[6,] 3 10/12 c
# [,1] is a unique identifier, [,2] is a date, and [,3] is a type of occurrance

我需要做的是生成一个表,其中每天每个 ID 只包含一个条目有一列显示该条目是仅对应于“c”、仅对应于“pv”、“c & pv”还是“多个 c”。数据中不可能有多个pv

我这样做的方法是使用嵌套的 for 循环:

# I generate an object to post the data to
output.temp <- matrix(NA, nrow = 1, ncol = 4)

# Then I define the outer loop that subsets the data over each ID
ids <- unique(data[,1])
n.ids <- length(ids)

for(i in 1:n.ids){
temp.data <- subset(data, data[,1] == ids[i])

dates <- unique(temp.data[,2])
n.dates <- length(dates)

# Then I define the inner loop that subsets the data for each ID over each date
for(j in 1: n.dates){
date.data <- subset(temp.data, temp.data[,2] == dates[j])

# Then I apply the logic of what to write out
if(nrow(date.data) == 1){
if(date.data[,3] == 'c'){
new.row <- cbind(date.data, "c only")
output.temp <- rbind(output.temp, new.row)
}
if(date.data[,3] == 'pv'){
new.row <- cbind(date.data, "pv only")
output.temp <- rbind(output.temp, new.row)
}
}

if(nrow(date.data) > 1){
if('pv' %in% date.data[,3]){
new.row <- cbind(matrix(date.data[1,], nrow = 1), c("c & pv"))
output.temp <- rbind(output.temp, new.row)
}
else{
new.row <- cbind(matrix(date.data[1,], nrow = 1), " multiple c only")
output.temp <- rbind(output.temp, new.row)
}
}
}
}

# Finally, I drop the unnecessary row and column from the output object
output.final <- output.temp[-1,-3]

这可行,但效率极低。随着我的数据集变大(接近 100 万行),它变得越来越成问题。

由于我是 R 的新手并且几乎没有编程经验,因此非常感谢任何关于替代策略的建议。

最佳答案

您应该能够使用下面的代码来获得您需要的输出的确切格式。

dataset <- data.table(dataset)
setnames(dataset, c('id','day','occurrence'))

dataset[,list(noofc = table(occurrence)['c'], noofpv = table(occurrence)['pv']), by = c('id','day')]

data.table 是非常高效的数据框,应该也有助于解决数据大小问题

关于在 R 中使用 for 循环记录分层数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19478719/

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