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