循环覆盖结果

时间:2016-01-25 18:53:19

标签: r loops

我最近询问了this关于行选择的问题,并且很快得到了解决方案。但是,我忽略了我需要重复执行这个选择的因素(“日期”,见下文)。有更优雅的方法可以做到这一点,但我想我可以使用一个简单的for循环。循环运行,但我遇到了覆盖结果的旧问题。我查看了this帖子,但它没有解决问题。这就是我所做的:

row.number <- c(1:18)
date <- c(rep("A",5), rep("B", 6), rep("C",7))
ID <- c(1,1,2,2,2,1,1,1,2,2,3,1,1,2,2,2,3,3)
dat <- cbind(row.number,date,ID)
dat <- as.data.frame(dat)

IDU_date <- unique(date)

x <- data.frame(mode = "numeric", length = 0)

for(i in seq_along(IDU_date))
{
  tf<-dat$date==IDU_date[i]     
  sub.dat<-dat[tf,]

  x <- setDT(sub.dat)[, if(.N >1) .SD[ceiling(.N/2)] else .SD ,sub.dat$ID]
}

这就是我希望结果如下:

row.number <- c(1,4,7,9,11,12,15,17)
date <- c("A","A","B","B","B","C","C","C")
ID <- c(1,2,1,2,3,1,2,3)
dat <- cbind(row.number,date,ID)
dat <- as.data.frame(dat)

再一次,帮助我会非常感激,即使这不是一个挑战!

2 个答案:

答案 0 :(得分:2)

我可能会误解所需的输出,但是使用for循环来分割数据帧并将其转换为res <- dat[, .SD[ceiling(.N/2)], by=.(ID,date)] 似乎有点费解。

为什么不按ID和日期拆分?这符合您想要的输出。如果N == 1,则ceiling.N / 2将为1,否定对if语句的需要。

dat <- structure(list(row.number = c(1, 4, 7, 9, 11, 12, 15, 17), date = c("A", 
"A", "B", "B", "B", "C", "C", "C"), ID = c(1, 2, 1, 2, 3, 1, 
2, 3)), .Names = c("row.number", "date", "ID"), row.names = c(NA, 
-8L), class = c("data.table", "data.frame"))

使用的数据:

from itertools import islice

def get_value(f, row, col):
    line = next(islice(f, row - 1, row))
    values = line.split(',')
    return values[col - 1]

with open('data.csv', 'r') as f:
    print(get_value(f, 10, 4))

答案 1 :(得分:0)

循环每次都会自动重写x的值,因此你需要在循环中绑定x的每个输出:

library(data.table)
row.number <- c(1:18)
date <- c(rep("A",5), rep("B", 6), rep("C",7))
ID <- c(1,1,2,2,2,1,1,1,2,2,3,1,1,2,2,2,3,3)
dat <- cbind(row.number,date,ID)
dat <- as.data.frame(dat)
all.x <- data.frame()
IDU_date <- unique(date)
x <- data.frame(mode = "numeric", length = 0)
for(i in seq_along(IDU_date))
 {
    tf<-dat$date==IDU_date[i]     
    sub.dat<-dat[tf,]  
    x <- setDT(sub.dat)[, if(.N >1) .SD[ceiling(.N/2)] else .SD ,sub.dat$ID]
    all.x <- rbind(all.x, x)
 }