Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/76.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
与R中的'ifelse'相比,创建新变量的更好方法是什么?_R_Dataframe_Variables - Fatal编程技术网

与R中的'ifelse'相比,创建新变量的更好方法是什么?

与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,但它给了我太

我的工作对象是: -面板数据集 -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
,但它给了我太多的空白:

    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