我最近询问了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)
再一次,帮助我会非常感激,即使这不是一个挑战!
答案 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)
}