将函数应用于列表

时间:2014-06-09 15:14:36

标签: r

这是我的数据集

中的一个小例子
Time <- c(0.1, 0.2, 0.3, 0.1, 0.3)
Individual <- c("A", "A", "A", "B", "B")
data <- data.frame(Individual, Time)
data$Individual <- as.character(data$Individual)

  Individual Time
1          A  0.1
2          A  0.2
3          A  0.3
4          B  0.1
5          B  0.3

我希望创建一个名为“Interval”的新列,它代表每个人每行之间的时间间隔。 Interval列的目标输出为“na”,0.1,0.1,“na”,0.2。

我列出了个人名单

ind.id<-unique(data$Individual)
ind.list<-lapply(1:length(ind.id), function(i){subset(data, data$Individual==ind.id[i])})

但唯一缺少的是计算列表中每个个体的时间线差异并将其放回可用数据帧的功能。有什么想法吗?

非常感谢,非常感谢您的帮助。

3 个答案:

答案 0 :(得分:7)

使用ave的R基础解决方案:

data$val <- 
 ave(data$Time,data$Individual,FUN=function(x)c(NA,diff(x)))

# Individual Time val
# 1          A  0.1  NA
# 2          A  0.2 0.1
# 3          A  0.3 0.1
# 4          B  0.1  NA
# 5          B  0.3 0.2

答案 1 :(得分:5)

试试这个:

library(plyr)
ddply(data,.(Individual),transform,val = c(NA,diff(Time)))
  Individual Time val
1          A  0.1  NA
2          A  0.2 0.1
3          A  0.3 0.1
4          B  0.1  NA
5          B  0.3 0.2

使用 data.table dplyr 软件包可以实现更快的替代方案。

答案 2 :(得分:4)

使用R基本功能

> transform(data, val=ave(Time, Individual, FUN=function(x) c(NA, diff(x))))
  Individual Time val
1          A  0.1  NA
2          A  0.2 0.1
3          A  0.3 0.1
4          B  0.1  NA
5          B  0.3 0.2