For 循环遍历数据框的列以使用 if else 语句创建列:R 版本 4.1.2
For loop through columns of dataframe to create columns using ifelse statment : R version 4.1.2
这是我的问题:我的数据框有多个事件(下面的事件 1 到事件 4),其中后续行动的结束时间是任何事件的时间。我使用 survSplit 将此数据帧从宽格式转换为长格式。 survSplit 似乎一次只能处理一种事件类型,因此我决定使用嵌套的 ifelse 语句手动执行此操作,该语句似乎一直有效,直到我想在 for 循环中执行相同的操作,该循环将从事件列到事件列(我的真实数据集有 33 种结果类型)。循环失败并给出以下错误消息:
错误:分配的数据 value
必须与现有数据兼容。
x 现有数据有 12 行。
x 分配的数据有 0 行。
i 只有大小为 1 的向量被回收。
运行 rlang::last_error()
看看哪里出错了。
另外: 警告信息:
未知或未初始化的列:event
.
install.packages("survival")
install.packages("dplyr")
library(survival)
library(dplyr)
cutpoints.l <- c(1.25)
f12 <- data.frame(id = 1:6,
next.ivl= c(22.348, 1.837, 2.051,1.782,1.692, 1.730),
event1 = c(0,1,0,0,1,0),
event2 = c(1,0,0,0,0,1),
event3 = c(0,0,1,1,0,0),
event4 = c(0,0,0,0,0,0),
enter= rep(0,6),
end=c(22.348, 1.837,2.051,1.782,1.629,1.730))
f12.split <- survSplit(Surv(next.ivl,event1)~.,f12,
cut = cutpoints.l,
event = "event1",
start = "enter",
end = "next.ivl",
episode = "ivl")
f12.split <- f12.split %>%
group_by(id) %>%
mutate(n = ifelse(row_number() == 1, 1, 0))%>%
mutate(N = ifelse(row_number() == n(), 1, 0))
events<-grep("event", colnames(f12.split), value = TRUE)
for (event in events) {
print(event)
f12.split$event<-ifelse(f12.split$N==1 & f12.split$event==1, ifelse(f12.split$n==1 &
f12.split$event==1,0,1),0)
}
听起来您只想重塑 event*
列而不进行其他操作。这可以直接使用 tidyr::pivot_longer
或 reshape2::melt
:
完成
tidyr::pivot_longer(f12, starts_with("event"), names_to = "event")
# # A tibble: 24 x 6
# id next.ivl enter end event value
# <int> <dbl> <dbl> <dbl> <chr> <dbl>
# 1 1 22.3 0 22.3 event1 0
# 2 1 22.3 0 22.3 event2 1
# 3 1 22.3 0 22.3 event3 0
# 4 1 22.3 0 22.3 event4 0
# 5 2 1.84 0 1.84 event1 1
# 6 2 1.84 0 1.84 event2 0
# 7 2 1.84 0 1.84 event3 0
# 8 2 1.84 0 1.84 event4 0
# 9 3 2.05 0 2.05 event1 0
# 10 3 2.05 0 2.05 event2 0
# # ... with 14 more rows
reshape2::melt(f12, id.vars = c("id", "next.ivl", "enter", "end"), variable.name = "event")
# id next.ivl enter end event value
# 1 1 22.348 0 22.348 event1 0
# 2 2 1.837 0 1.837 event1 1
# 3 3 2.051 0 2.051 event1 0
# 4 4 1.782 0 1.782 event1 0
# 5 5 1.692 0 1.629 event1 1
# 6 6 1.730 0 1.730 event1 0
# 7 1 22.348 0 22.348 event2 1
# 8 2 1.837 0 1.837 event2 0
# 9 3 2.051 0 2.051 event2 0
# 10 4 1.782 0 1.782 event2 0
# 11 5 1.692 0 1.629 event2 0
# 12 6 1.730 0 1.730 event2 1
# 13 1 22.348 0 22.348 event3 0
# 14 2 1.837 0 1.837 event3 0
# 15 3 2.051 0 2.051 event3 1
# 16 4 1.782 0 1.782 event3 1
# 17 5 1.692 0 1.629 event3 0
# 18 6 1.730 0 1.730 event3 0
# 19 1 22.348 0 22.348 event4 0
# 20 2 1.837 0 1.837 event4 0
# 21 3 2.051 0 2.051 event4 0
# 22 4 1.782 0 1.782 event4 0
# 23 5 1.692 0 1.629 event4 0
# 24 6 1.730 0 1.730 event4 0
这是我的问题:我的数据框有多个事件(下面的事件 1 到事件 4),其中后续行动的结束时间是任何事件的时间。我使用 survSplit 将此数据帧从宽格式转换为长格式。 survSplit 似乎一次只能处理一种事件类型,因此我决定使用嵌套的 ifelse 语句手动执行此操作,该语句似乎一直有效,直到我想在 for 循环中执行相同的操作,该循环将从事件列到事件列(我的真实数据集有 33 种结果类型)。循环失败并给出以下错误消息:
错误:分配的数据 value
必须与现有数据兼容。
x 现有数据有 12 行。
x 分配的数据有 0 行。
i 只有大小为 1 的向量被回收。
运行 rlang::last_error()
看看哪里出错了。
另外: 警告信息:
未知或未初始化的列:event
.
install.packages("survival")
install.packages("dplyr")
library(survival)
library(dplyr)
cutpoints.l <- c(1.25)
f12 <- data.frame(id = 1:6,
next.ivl= c(22.348, 1.837, 2.051,1.782,1.692, 1.730),
event1 = c(0,1,0,0,1,0),
event2 = c(1,0,0,0,0,1),
event3 = c(0,0,1,1,0,0),
event4 = c(0,0,0,0,0,0),
enter= rep(0,6),
end=c(22.348, 1.837,2.051,1.782,1.629,1.730))
f12.split <- survSplit(Surv(next.ivl,event1)~.,f12,
cut = cutpoints.l,
event = "event1",
start = "enter",
end = "next.ivl",
episode = "ivl")
f12.split <- f12.split %>%
group_by(id) %>%
mutate(n = ifelse(row_number() == 1, 1, 0))%>%
mutate(N = ifelse(row_number() == n(), 1, 0))
events<-grep("event", colnames(f12.split), value = TRUE)
for (event in events) {
print(event)
f12.split$event<-ifelse(f12.split$N==1 & f12.split$event==1, ifelse(f12.split$n==1 &
f12.split$event==1,0,1),0)
}
听起来您只想重塑 event*
列而不进行其他操作。这可以直接使用 tidyr::pivot_longer
或 reshape2::melt
:
tidyr::pivot_longer(f12, starts_with("event"), names_to = "event")
# # A tibble: 24 x 6
# id next.ivl enter end event value
# <int> <dbl> <dbl> <dbl> <chr> <dbl>
# 1 1 22.3 0 22.3 event1 0
# 2 1 22.3 0 22.3 event2 1
# 3 1 22.3 0 22.3 event3 0
# 4 1 22.3 0 22.3 event4 0
# 5 2 1.84 0 1.84 event1 1
# 6 2 1.84 0 1.84 event2 0
# 7 2 1.84 0 1.84 event3 0
# 8 2 1.84 0 1.84 event4 0
# 9 3 2.05 0 2.05 event1 0
# 10 3 2.05 0 2.05 event2 0
# # ... with 14 more rows
reshape2::melt(f12, id.vars = c("id", "next.ivl", "enter", "end"), variable.name = "event")
# id next.ivl enter end event value
# 1 1 22.348 0 22.348 event1 0
# 2 2 1.837 0 1.837 event1 1
# 3 3 2.051 0 2.051 event1 0
# 4 4 1.782 0 1.782 event1 0
# 5 5 1.692 0 1.629 event1 1
# 6 6 1.730 0 1.730 event1 0
# 7 1 22.348 0 22.348 event2 1
# 8 2 1.837 0 1.837 event2 0
# 9 3 2.051 0 2.051 event2 0
# 10 4 1.782 0 1.782 event2 0
# 11 5 1.692 0 1.629 event2 0
# 12 6 1.730 0 1.730 event2 1
# 13 1 22.348 0 22.348 event3 0
# 14 2 1.837 0 1.837 event3 0
# 15 3 2.051 0 2.051 event3 1
# 16 4 1.782 0 1.782 event3 1
# 17 5 1.692 0 1.629 event3 0
# 18 6 1.730 0 1.730 event3 0
# 19 1 22.348 0 22.348 event4 0
# 20 2 1.837 0 1.837 event4 0
# 21 3 2.051 0 2.051 event4 0
# 22 4 1.782 0 1.782 event4 0
# 23 5 1.692 0 1.629 event4 0
# 24 6 1.730 0 1.730 event4 0