我正在尝试找到一种方法,用于根据出现在一个列/变量中的某个字符串的每次出现来对数据帧进行子集或切片-例如,我想删除两次出现的字符串之间的所有行。这个问题类似于这个问题,但是关键的区别是我有多次出现该字符串,并且想删除每对出现之间的行。我是R笨拙,我找不到以任何优雅的方式将解决方案应用于两个以上整数的索引的方法。
说我有以下数据框:
a <- c("one", "here is a string", "two", "three", "four", "another string", "five", "six", "yet another string", "seven", "last string")
b <- c("a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k")
c <- c("type1", "type1", "type1", "type1", "type1", "type1", "type2", "type2", "type2", "type2", "type2")
df <- data.frame(a,b,c)
给出以下内容:
print(df)
a b c
1 one a type1
2 here is a string b type1
3 two c type1
4 three d type1
5 four e type1
6 another string f type1
7 five g type2
8 six h type2
9 yet another string i type2
10 seven j type2
11 last string k type2
我想对其进行子集化,以便删除字符串'string'之间的所有行(包括字符串的任何迭代):
a b c
1 one a type1
2 five g type2
8 six h type2
使用我链接到的问题中接受的解决方案,我可以通过创建行号索引并使用索引中的前两个位置来删除第一组行:
index = grep("string", df$a)
df[-(ind[1]:ind[2]),]
但是我想做的还包括删除索引中下一对整数之间的行
df[-(ind[3]:ind[4]),]
我的实际索引有128个整数(64个“对”),因此像我在上面所做的那样手动提取行会很麻烦。如果找不到合适的解决方案,我当前的计划是打印索引并手动提取行(tbh,可能比编写此问题要快,但看起来很糟糕,不会教我任何东西):
print(index)
[1] 2 6 9 11
df[-c(2:6, 9:11), ]
有没有一种方法可以遍历索引中的每对连续整数,或者有另一种方法可以做我想做的事情?我不是一个非常有经验的R用户,因此在创建此示例之前(我希望遵循reprex标准;这是我第一次提出问题),我一直在搜索SO以了解我要尝试做的事情。
我在reprex中包括了列“ c”,因为它反映了我实际数据的结构(对于列“ c”的每次观察变化,列“ a”中都有一对“字符串”出现),我想知道是否有一种方法可以将group_by()与基本子设置表达式一起使用?但这可能完全是鲱鱼。只是包括它以防万一。
在连续的index
使用对之间创建一个序列,Map
并删除这些行。获取连续对的一种方法是使用备用逻辑值。
df[-unlist(Map(`:`, index[c(TRUE, FALSE)], index[c(FALSE, TRUE)])),]
# a b c
#1 one a type1
#7 five g type2
#8 six h type2
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句