2016-04-13 16 views
2

我有兩個柱,col1和COL2,我必須在Excel下述式下COL3請告訴我將R當量以下Excel操作

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」

+1

我無法弄清楚如何引用先前的小區 –

+0

@VincentGuillemot:我覺得這裏的問題是,該功能是遞歸的,並且可能取決於以前細胞的價值,所以矢量化很難做,我會去一個很好的舊循環... – digEmAll

回答

5

我會用一個簡單的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 
+1

美麗和簡單!也喜歡使用相同的功能。非常感謝你! –

1

你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 

Multiplicating與1邏輯值轉換爲數字。再次

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

在Excel中,可以優化COL3太的N()式變換的邏輯值到數字。

+0

根據我給你的數據,你的答案是正確的,但它不遵循公式中的邏輯,即在col1 = 0和col2 = 1,col3 = 0的情況下(給定之前的col3行不是1) 。謝謝你的回答 –

+0

沒錯,但是如果只有0和1,並且你的結果不是矛盾的或者基於更復雜的邏輯,你總是可以使用邏輯運算。 :-) – Abraxas

+0

不能與此爭論:-) –

1
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 
2

使用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 
+1

不錯!滯後函數對我來說是新事物 –