与R中的'ifelse'相比,创建新变量的更好方法是什么?
我的工作对象是: -面板数据集 -10个时段 我需要创建一个虚拟变量,与R中的'ifelse'相比,创建新变量的更好方法是什么?,r,dataframe,variables,R,Dataframe,Variables,我的工作对象是: -面板数据集 -10个时段 我需要创建一个虚拟变量,RL,如果虚拟变量RS已经被1一次,则它永远等于1(TRUE) 换言之: 新变量RL(跨越10个周期)必须在t中为1,如果RS在t-1周期中为1,则所有后续周期都必须为1。如果RS中没有发生TRUE,并且RS为0(FALSE)则RL也应为0 一旦TRUE发生在RS时段t,则RL必须1之后(在t+1、t+2、t+3、t+4…、t+面板末端) 我的问题是FALSE不能正确地理解为0,而与NA一样 我使用了ifelse,但它给了我太
RL
,如果虚拟变量RS
已经被1
一次,则它永远等于1(TRUE)
换言之:
新变量RL
(跨越10个周期)必须在t中为1
,如果RS
在t-1周期中为1
,则所有后续周期都必须为1。如果RS
中没有发生TRUE
,并且RS
为0(FALSE)
则RL
也应为0
一旦TRUE
发生在RS
时段t,则RL
必须1
之后(在t+1、t+2、t+3、t+4…、t+面板末端)
我的问题是FALSE
不能正确地理解为0
,而与NA
一样
我使用了ifelse
,但它给了我太多的空白:
df$r_1RL <- rep(0,nrow(df)) # is = 0 cause noone can retire in t-1 since "RS0" doesn't exists
df$r_2RL <- ifelse( df$r_1RS == 1, 1, ifelse(df$r_1RS == 0, 0, NA))
df$r_3RL <- ifelse( (df$r_1RS == 1 | df$r_2RS == 1), 1, ifelse( (df$r_1RS == 0 | df$r_2RS == 0), 0, NA))
df$r_4RL <- ifelse( (df$r_1RS == 1 | df$r_2RS == 1 | df$r_3RS == 1), 1, ifelse( (df$r_1RS == 0 | df$r_2RS == 0 | df$r_3RS == 0), 0, NA))
df$r_5RL <- ifelse( (df$r_1RS == 1 | df$r_2RS == 1 | df$r_3RS == 1 | df$r_4RS == 1 ), 1, ifelse( (df$r_1RS == 0 | df$r_2RS == 0 | df$r_3RS == 0 | df$r_4RS == 0), 0, NA))
and so on... up to 10RL
df <- structure(list(r_1RS = c(FALSE, FALSE, FALSE, FALSE, FALSE, NA
), r_2RS = c(FALSE, NA, FALSE, FALSE, FALSE, NA), r_3RS = c(FALSE,
FALSE, FALSE, FALSE, FALSE, NA), r_4RS = c(FALSE, FALSE, FALSE,
FALSE, NA, FALSE), r_5RS = c(FALSE, TRUE, FALSE, FALSE, NA, FALSE
), r_6RS = c(FALSE, FALSE, FALSE, FALSE, NA, TRUE), r_7RS = c(FALSE,
FALSE, FALSE, FALSE, NA, FALSE), r_8RS = c(TRUE, FALSE, FALSE,
FALSE, FALSE, FALSE), r_9RS = c(FALSE, FALSE, FALSE, FALSE, FALSE,
FALSE), r_10RS = c(FALSE, FALSE, TRUE, FALSE, NA, FALSE), r_1RL = c(0,
0, 0, 0, 0, 0), r_2RL = c(0, 0, 0, 0, 0, NA), r_3RL = c(0, NA,
0, 0, 0, NA), r_4RL = c(0, NA, 0, 0, 0, NA), r_5RL = c(0, NA,
0, 0, NA, NA), r_6RL = c(0, 1, 0, 0, NA, NA), r_7RL = c(0, 1,
0, 0, NA, 1), r_8RL = c(0, 1, 0, 0, NA, 1), r_9RL = c(1, 1, 0,
0, NA, 1), r_10RL = c(1, 1, 0, 0, NA, 1)), row.names = c(NA,
-6L), class = c("tbl_df", "tbl", "data.frame"))
df$r_1RL这感觉非常粗糙,我不喜欢它,但它对您的示例数据有效。你可能会采取一般的想法,使它更有效率。如果遇到任何问题,请告诉我
# Using the first 10 columns of your dput dataframe
df <- df[1:10]
> df
# A tibble: 6 x 10
r_1RS r_2RS r_3RS r_4RS r_5RS r_6RS r_7RS r_8RS r_9RS r_10RS
<lgl> <lgl> <lgl> <lgl> <lgl> <lgl> <lgl> <lgl> <lgl> <lgl>
1 FALSE FALSE FALSE FALSE FALSE FALSE FALSE TRUE FALSE FALSE
2 FALSE NA FALSE FALSE TRUE FALSE FALSE FALSE FALSE FALSE
3 FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE TRUE
4 FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
5 FALSE FALSE FALSE NA NA NA NA FALSE FALSE NA
6 NA NA NA FALSE FALSE TRUE FALSE FALSE FALSE FALSE
# Createing a copy for the new columns
df2 <- df
# There may be other ways to handle NA's but you mentioend you want them
# as zero so this should work for you
df2[is.na(df2)] <- 0
# Changing all values after TRUE to 1
df2 <- data.frame(t(apply(df2, 1, function(x) as.numeric(cumsum(x) > 0))))
# Chaning the names
names(df2) <- sub("RS", "RL", names(df), fixed = T)
# Combining the columns
> cbind(df, df2)
r_1RS r_2RS r_3RS r_4RS r_5RS r_6RS r_7RS r_8RS r_9RS r_10RS r_1RL r_2RL r_3RL r_4RL r_5RL r_6RL r_7RL r_8RL r_9RL r_10RL
1 FALSE FALSE FALSE FALSE FALSE FALSE FALSE TRUE FALSE FALSE 0 0 0 0 0 0 0 1 1 1
2 FALSE NA FALSE FALSE TRUE FALSE FALSE FALSE FALSE FALSE 0 0 0 0 1 1 1 1 1 1
3 FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE TRUE 0 0 0 0 0 0 0 0 0 1
4 FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE 0 0 0 0 0 0 0 0 0 0
5 FALSE FALSE FALSE NA NA NA NA FALSE FALSE NA 0 0 0 0 0 0 0 0 0 0
6 NA NA NA FALSE FALSE TRUE FALSE FALSE FALSE FALSE 0 0 0 0 0 1 1 1 1 1
你的意思是像cumsum(RS)>0?我添加了一张图片来显示我想要的东西,尽管这不是一个好的行为。但是我很难解释我的问题Hello Emil,我想如果你能添加一个数据帧df的小示例,以及一个所需输出的示例,那会有所帮助。我不知道如何重新创建这个数据帧。我发布了一张图片,但是使用dput(df)
并在您的问题中复制粘贴输出
# Changing all values after TRUE to 1
df2[] <- lapply(df2, as.numeric)
df2_t <- data.frame(t(df2))
> data.frame(t(cumsum(df2_t) > 0)*1)
r_1RS r_2RS r_3RS r_4RS r_5RS r_6RS r_7RS r_8RS r_9RS r_10RS
X1 0 0 0 0 0 0 0 1 1 1
X2 0 0 0 0 1 1 1 1 1 1
X3 0 0 0 0 0 0 0 0 0 1
X4 0 0 0 0 0 0 0 0 0 0
X5 0 0 0 0 0 0 0 0 0 0
X6 0 0 0 0 0 1 1 1 1 1