如何设置在列之间(在数据框内)进行操作的函数

时间:2019-07-18 22:04:33

标签: r dataframe dplyr tidyverse

问题

我正在创建一个函数,该函数描述给定时间序列的时间状态的变化。 它会说给定列的值是否大于,等于或小于上一个,并打印结果:   它可以在同一数据帧中,也可以在其他不同对象中。我正在做   它可以转换数据以便于生存分析。

做了什么

我已经制作了一个if if else梯形图,如下所示:其中(x)是数据包中的i列,而(y)是它之前(i-1)的列。但是,我不知道如何定义函数的第一行以在数据帧的每一列中实际执行此操作(从第二列开始计数),也不要崩溃到最后一列

func_name <- function (x, columns) {
if (x == NA) {
print("gone")
} else if (x < y) {
print("less")
} else if (x > y) {
print("more")
} else if (x = y) {
print("same")
} else {
print ("")
}
}

期待什么

理想情况下将进行如下更改:

Id <- c(1,2,3)
Time1 <- c(3,3,4)
Time2 <- c(2,5,4)
Time3 <- c(1,5,8)
df <- data.frame(Id,Time1,Time2,Time3)
df

变成这样:

Id <- c(1,2,3)
Time1 <- c(3,3,4)
Time2 <- c("Less","More","Same")
Time3 <- c("Less","Same","More")
df2 <- data.frame(Id,Time1,Time2,Time3)
df2

任何帮助,高度赞赏!

解决方案:@Andrew和@Cole解决方案都可以解决问题!

2 个答案:

答案 0 :(得分:2)

这听起来像是您要寻找的。它不是自定义功能,但是如果需要可以进行修改。希望这可以帮助!

# Select the columns you need. NOTE: used [-1] to remove starting time column
cols <- grep("Time", names(df), fixed = T)[-1]

# Use case_when with your conditions
df[cols] <- lapply(cols, function(i) dplyr::case_when(
  is.na(df[i]) ~ "Gone",
  df[i] > df[i-1] ~ "More",
  df[i] < df[i-1] ~ "Less",
  df[i] == df[i-1] ~ "Same"
))

df
  Id Time1 Time2 Time3
1  1     3  Less  Less
2  2     3  More  Same
3  3     4  Same  More

答案 1 :(得分:1)

这里使用mapply和内部的匿名函数:

df <- data.frame(Id,Time1,Time2,Time3)

df[, 3:4] <- mapply(function(x, y) ifelse(y < x , 'Less', ifelse(y > x, 'More', 'Same'))
                    , df[, 2:3]
                    , df[, 3:4])
df

mapply将遍历数据集的每个字段并应用一个函数。换句话说,我采用df[, 2]df[, 3]之间的差异,然后是df[, 3]df[, 4]之间的差异。我也可以做类似的事情:

fx_select <- function(x, y) {
ifelse(y < x, 'Less', ifelse(y > x, 'More', 'Same'))
}

df[, 3:4] <- mapply(fx_select, df[, 2:3], df[, 3:4])