什么是下面的Excel操作的R相当于

我有两列,col1和col2,并且在excel下有col3下面的公式

col1 col2 col3 0 0 0 1 0 1 0 1 1 0 0 0 1 1 1 0 0 0 

假设col1是单元格A1

 C2 formula: =A2 C3 formula: =IF(A3=1,1,IF(B2=1,0,C2)) 

我只能做到第一部分,

 df$col3 <- ifelse(df$col1 == 1, 1, 0) 

我怎么能做到这一点在R,假设我的数据框被称为“DF”

我会用一个简单的for循环:

 df <- read.csv(text="col1,col2,expectedCol3 0,0,0 1,0,1 0,1,1 0,0,0 1,1,1 0,0,0") df$col3 <- NA # initialize column for(i in 1:nrow(df)){ if(i == 1){ df$col3[i] <- df$col1[i] }else{ df$col3[i] <- ifelse(df$col1[i] == 1, 1, ifelse(df$col2[i-1]==1,0,df$col3[i-1])) } } # are expected and calculated identical ? identical(df$col3,df$expectedCol3) # > TRUE 

使用dplyr::lag()函数:

 df <- read.table(text = "col1 col2 col3 0 0 0 1 0 1 0 1 1 0 0 0 1 1 1 0 0 0", header = TRUE) library(dplyr) result <- df %>% # C3 formula: =IF(A3=1,1,IF(B2=1,0,C2)) mutate(res = ifelse(col1 == 1, 1, ifelse(lag(col2) == 1, 0, NA)), res = ifelse(is.na(res), lag(res), res)) # C2 formula: =A2 result$res[1] <- result$col1[1] result # col1 col2 col3 res # 1 0 0 0 0 # 2 1 0 1 1 # 3 0 1 1 1 # 4 0 0 0 0 # 5 1 1 1 1 # 6 0 0 0 0 

你的C3公式是对col1和col2的一个操作。 如下公式:

 col3 = col1 OR col2 

所以基本上做一个操作:

在R:

 col1 <- c(0, 1, 0, 0, 1, 0) col2 <- c(0, 0, 1, 0, 1, 0) df <- data.frame(col1, col2) df$col3 <- (df$col1 == 1 | df$col2 == 1) * 1 df 

与1复用将逻辑值转换为数字。

在Excel中你也可以优化col3:

 C3 formula =N(OR(A2:B2)) 

再次:N()公式将您的逻辑值转换为数字。

  df=data.frame(col1=c(0,1,0,0,1,0), col2=c(0,0,1,0,1,0)) # shift B column to get "previous" value in every row. df$col2_prev=head(c(NA,df$col2),-1); df$col3 <- ifelse(is.na(df$col2_prev), df$col2, ifelse(df$col1 == 1, 1, ifelse(df$col2_prev == 1, 0, df$col2) ) ) df[c("col1","col2","col3")] col1 col2 col3 1 0 0 0 2 1 0 1 3 0 1 1 4 0 0 0 5 1 1 1 6 0 0 0