我正在创建一个函数,该函数描述给定时间序列的时间状态的变化。 它会说给定列的值是否大于,等于或小于上一个,并打印结果: 它可以在同一数据帧中,也可以在其他不同对象中。我正在做 它可以转换数据以便于生存分析。
我已经制作了一个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
任何帮助,高度赞赏!
答案 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])