r数据帧中不同子集的不同计算

时间:2018-06-15 00:16:13

标签: r subset calculation

我正在尝试在我的r数据框中添加一列,根据直径计算干重(在多个日期测量多个生长对象的直径)。直径和干重之间的关系随时间变化,这就是为什么我在不同的日期使用不同的公式。

object<-c(1,1,1,2,2,2)
date<-c(7,8,9,7,8,9)
diam<-c(2,3,4,1,3,5)
df<-data.frame(object,date,diam)

  object date diam
1      1    7    2
2      1    8    3
3      1    9    4
4      2    7    1
5      2    8    3
6      2    9    5

假设我想对日期7和8使用公式y = 5x + 17,并使用公式y = 3x + 16表示日期9。 我试过这个:

df$dw<-5*dw$diam-17[df$diam<=8]

但是它告诉我在替换和数据中有不同的行数,这当然是正确的。如果我可以告诉它只是将NAs放在df $ diam> 8的位置,那就没关系,但我不知道该怎么做。我尝试过使用子集函数,但也没有任何运气。我唯一能想到的是制作一大堆独立的数据帧 - 每个公式一个,但这是一个非常优雅(和复杂)的解决方案!

# desired outcome
df$dw
[1] 27 32 28 22 32 31

谢谢你们!

3 个答案:

答案 0 :(得分:1)

使用dplyr case_when的优雅,可读解决方案适用于date的无数子组。

library(dplyr)
df %>% 
  mutate( dw = case_when ( date %in% c(7,8) ~ diam * 5 + 17,
                           date %in% c(9)   ~ diam * 3 + 16 ) )

#   object date diam dw
# 1      1    7    2 27
# 2      1    8    3 32
# 3      1    9    4 28
# 4      2    7    1 22
# 5      2    8    3 32
# 6      2    9    5 31

答案 1 :(得分:0)

一种方法(取决于你需要计算多少日期以及你想对结果做什么)可能是为每个日期创建列,然后应用然后你可以将相关的公式应用到相关列

library(tidyverse)
df$date <- paste0("Day", df$date)
df2 <- df %>% spread(date, diam)

#  object Day7 Day8 Day9
#1      1    2    3    4
#2      2    1    3    5

df2$Day7*5+17
#[1] 27 22

修改
如果只计算两个公式(如上例所示),则可选择一个单行和更快的选项:

ifelse(df$date %in% c('Day7', 'Day8'), df$diam*5+17, df$diam*3+16)
#[1] 27 32 28 22 32 31

答案 2 :(得分:0)

不确定这是否是最简单或最优雅的解决方案(可能不是),但这似乎有效:

df$dw[which(df$date<=8)]<-5*df$diam[which(df$date<=8)]-17
df$dw[which(df$date==9)]<-3*df$diam[which(df$date==9)]-16

我玩了一段时间(),并且不断收到错误信息,说明行数不同。我现在明白那是因为我把条件放在&lt; - 而不是另一边。