2016-11-17 51 views
1

我有一個數據幀和失敗我想由條件檢查另一column.If的tailhead值條件爲匹配來添加新的列ex,插入ex1ex2添加到新列。 這裏是我的意思突變和ifelse()時的列的邏輯檢查尾部頭值

x = rep(c(seq(1,3),seq(2,3)),2) 
grp=gl(2,5) 
df <- data.frame(x,grp) 


#  x grp 
# 1 1 1 
# 2 2 1 
# 3 3 1 
# 4 2 1 
# 5 3 1 
# 6 1 2 
# 7 2 2 
# 8 3 2 
# 9 2 2 
# 10 3 2 

我試圖

庫(dplyr)

dff <- df%>% 
group_by(grp)%>% 
mutate(ex=ifelse(tail(x,2)==c(2,3),tail(ex,2)="ex2"&head(ex,3)="ex1",NA)) 

>Error: unexpected '=' in: 
"group_by(grp)%>% 
mutate(ex=ifelse(tail(x,2)==c(2,3),tail(ex,2)=" 

預期輸出

#   x grp ex 
    # 1 1 1 ex1 
    # 2 2 1 ex1 
    # 3 3 1 ex1 
    # 4 2 1 ex2 
    # 5 3 1 ex2 
    # 6 1 2 ex1 
    # 7 2 2 ex1 
    # 8 3 2 ex1 
    # 9 2 2 ex2 
    # 10 3 2 ex2 

我怎麼能這樣做?

+0

沒有得到嘗試。你能通過一個例子來解釋一點嗎? 「x列尾和頭值」是什麼意思? –

+0

@RonakShah x列頭3值(1,2,3)和尾部2值(2,3)。這就是我的意思。 – Alexander

+0

我們如何認識頭部有3個值和尾部2? –

回答

1

我們可以data.table

library(data.table) 
i1 <- setDT(df)[, .I[tail(seq_len(.N),2)] , grp]$V1 
df[, ex:= "ex1"] 
df[df[i1, .I[x==c(2,3)] , grp]$V1, ex := "ex2"] 
df 
# x grp ex 
#1: 1 1 ex1 
#2: 2 1 ex1 
#3: 3 1 ex1 
#4: 2 1 ex2 
#5: 3 1 ex2 
#6: 1 2 ex1 
#7: 2 2 ex1 
#8: 3 2 ex1 
#9: 2 2 ex2 
#10:3 2 ex2 

或者使用dplyr

library(dplyr) 
df %>% 
    group_by(grp) %>% 
    mutate(x1 = rep(c(0, 2,3), c(n()-2, 1, 1)), 
      ex = if_else(x1==x & row_number() %in% tail(row_number(), 2), "ex2", "ex1")) %>% 
    select(-x1) 
#  x grp ex 
# <int> <fctr> <chr> 
#1  1  1 ex1 
#2  2  1 ex1 
#3  3  1 ex1 
#4  2  1 ex2 
#5  3  1 ex2 
#6  1  2 ex1 
#7  2  2 ex1 
#8  3  2 ex1 
#9  2  2 ex2 
#10  3  2 ex2 
+0

還有'dplyr'的方式嗎? – Alexander

+0

@Alexander以dplyr方式更新 – akrun

+0

哇。我並不期望這樣複雜的代碼。但那很好!謝謝你 – Alexander