r - R:在data.frame中创建一个具有特定非连续条件的新列
问题描述
想象一个人工数据框
IDtest<-c(1,1,1,1,1,1,2,2,2,3,3,3,3)
Class<-c(1,1,3,4,4,5,1,1,2,2,2,3,4)
Day<-c(0,47,76,100,150,173,0,47,76,0,47,76,100)
Area<-c(0.45,0.85,1.50,1.53,1.98,5.2,
0.36,0.58,1.2,
0.85,1.36,2.26,3.59)
df<-data.frame(cbind(IDtest, Class, Day, Area))
df
IDtest Class Day Area
1 1 1 0 0.45
2 1 1 47 0.85
3 1 3 76 1.50
4 1 4 100 1.53
5 1 4 150 1.98
6 1 5 173 5.20
7 2 1 0 0.36
8 2 1 47 0.58
9 2 2 76 1.20
10 3 2 0 0.85
11 3 2 47 1.36
12 3 3 76 2.26
13 3 4 100 3.59
I'll like to do:
1) For IDtest 1 in Class 1: step1 = 47 - 0
2) For IDtest 1 in Class 3: step1 = 76 - 47
3) For IDtest 1 in Class 4: step1 = 150 - 76
4) For IDtest 1 in Class 4: step1 = 173 - 150
up to IDtest 3.
为此尝试:
df$step1 <- NA
for (i in 1:max(df$Class)){
if(i == 1){
df$step1[Class == i] <- max(df$Day[df$Class == i]) - 0 # quite silly
}else{
df$step1[Class == i] <- max(df$Day[df$Class == i]) - max(df$Day[df$Class == i - 1]) # "Last" as the "previous" Class, not inside the same Class
}}
如果我的 Class 变量是连续的,但我的 Class 将值 1 更改为 3。在这种情况下,我的代码给了我 -Inf 值,因为必须使用最后一个 Class 值 (1) 而不是不存在的 2 .
我想要的输出是:
new.df
IDtest Class Day Area step1
1 1 1 0 0.45 47
2 1 1 47 0.85 47
3 1 3 76 1.50 29
4 1 4 100 1.53 74
5 1 4 150 1.98 74
6 1 5 173 5.20 23
您在这里看到任何简单的修改吗?
解决方案
我不确定这是否是你所追求的
merge(df,
within(
aggregate(Day ~ IDtest + Class, df, max),
step1 <- ave(Day, IDtest, FUN = function(x) diff(c(0, x)))
),
by = c("IDtest", "Class"),
all = TRUE
)
这使
IDtest Class Day.x Area Day.y step1
1 1 1 0 0.45 47 47
2 1 1 47 0.85 47 47
3 1 3 76 1.50 76 29
4 1 4 100 1.53 150 74
5 1 4 150 1.98 150 74
6 1 5 173 5.20 173 23
7 2 1 0 0.36 47 47
8 2 1 47 0.58 47 47
9 2 2 76 1.20 76 29
10 3 2 0 0.85 47 47
11 3 2 47 1.36 47 47
12 3 3 76 2.26 76 29
13 3 4 100 3.59 100 24
推荐阅读
- powerbi - 我的措施在日期过滤器的情况下不起作用
- react-native - 我应该如何在这个 fetch 方法中使用 asyncstorage.setItem?
- javascript - 无法在字符串文字运算符中获取索引的值,除了我尝试过的方式之外,还有什么方法可以获取该值?
- sql - 如何将三个表与其他两个返回的多个值行连接起来
- css - 响应式网站不适用于 Css 中的媒体查询
- react-native - “动作可能没有未定义的“类型”
- ruby-on-rails - Rails 在父子关系中访问子兄弟姐妹的最佳方式
- python - 如何在python中使用多个装饰器?
- flutter - 如何使用颤振从应用程序中导出文件中的csv?不使用简单的权限插件和permission_handler 插件
- excel - 查找具有相反重复项的单元格