R 逻辑检查尾部时Mutate和ifelse()失败(&;列的标题值

R 逻辑检查尾部时Mutate和ifelse()失败(&;列的标题值,r,dplyr,R,Dplyr,我有一个数据框,我想通过条件检查另一列的tail和head值来添加新列ex。如果条件匹配,请将ex1或ex2插入新列。 这就是我的意思 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

我有一个数据框,我想通过条件检查另一列的
tail
head
值来添加新列
ex
。如果条件匹配,请将
ex1
ex2
插入新列。 这就是我的意思

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

我该怎么做呢?

我们可以尝试使用
数据表

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

我不明白你的意思。你能举个例子再解释一下吗?你所说的
x列尾和列头值是什么意思?@RonakShah x列头3个值(1,2,3)和列尾2个值(2,3)。这就是我的意思。我们怎么知道head有3个值,tail 2呢?@RonakShah你只需要根据tail 2与(2,3)匹配的值创建
ex
列,那么这两行是
ex2
,其余的
ex1
。您可以从预期的输出中看到它。是否也有
dplyr
way?@Alexander更新了dplyr-wayWow。我没想到会有这么复杂的代码。但那很好!谢谢man@Alexander问题是,您正在将多个值与列进行比较,我们必须在比较时使长度相同。
rep
步骤创建另一列,其中2、3填充最后一个元素,0或任何其他值填充其余元素。如果原始列“x”中有0个值,我们使用%tail(..
 #          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
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
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