Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
基于";筛选行;复杂的;列R/dplyr中的字符串_R_Dplyr - Fatal编程技术网

基于";筛选行;复杂的;列R/dplyr中的字符串

基于";筛选行;复杂的;列R/dplyr中的字符串,r,dplyr,R,Dplyr,我可以使用特定列中的字符串筛选数据集,下面是一个示例数据集以及我是如何做到这一点的 ID = c(1, 2, 3, 4) String = c("Y N No", "Y", "Y No", "Y N") df = data.frame(ID, String) 问题是-我只想选择其中有N个的ID-或者-没有N个的ID df_2 <- dpylr::filter(df, !grepl('N', String)) Output: [2] [Y] 我的目标是过滤掉列中的所有N(范围从N、

我可以使用特定列中的字符串筛选数据集,下面是一个示例数据集以及我是如何做到这一点的

ID = c(1, 2, 3, 4)
String = c("Y N No", "Y", "Y No", "Y N")
df = data.frame(ID, String)
问题是-我只想选择其中有N个的ID-或者-没有N个的ID

df_2 <- dpylr::filter(df, !grepl('N', String)) 

Output: [2]  [Y]

我的目标是过滤掉列中的所有N(范围从N、N1、N4等)

我认为你的第二种方法是可行的,特别是如果你要拆分列进行下游分析。它还(国际海事组织)符合“整洁”要求。我还建议标准化
字符串
变量。是/是,否/否是不可接受的

tidyr
包有两个很好的函数,分别用于
分离的
聚集的

library(dplyr)
library(tidyr)

ID = c(1, 2, 3, 4)
String = c("Y N No", "Y", "Y No", "Y N")
String <- gsub(pattern = "No", "N", String)
df = data.frame(ID, String)

#Separate the String var
df_sep <- separate(df, col = String, into = c("R1", "R2", "R3"), sep = " ", extra = "merge")
#gather the columns
df_gat <- gather(df_sep, Cols, StrValue, R1:R3, -ID) 
#filter
filter(df_gat, StrValue == "N" | StrValue != "N")
库(dplyr)
图书馆(tidyr)
ID=c(1,2,3,4)
字符串=c(“Y N No”、“Y”、“Y No”、“Y N”)

String您可能想使用
sub
来替换任何模式匹配的
“N(\\d{1,3}\\\s}$)”
,意思是“N”后跟1-3位数字之一或空格或字符串结尾

我认为您不需要使用过滤,因为我理解英文描述,您希望使用字符值从中删除特定模式。我想象这些是化学符号,
N
是氮,
Na
是钠

ID = c(1, 2, 3, 4)
String = c("Y N No", "Y", "Y No", "Y N")
df = data.frame(ID, String)
df %>% filter(!grepl("(N\\d+|N\\s)", String))

Output: [Y] [Y No]

@MauritsEvers的回答也适用于第二段中更复杂的数据集,其中N后面的数字(如N2或N10)也将包含在参数中。删除包含“N”的“!”。

“但是,R不喜欢我这样做”你能更具体一点吗。“不喜欢”是什么?有错误吗?什么错误?我可以很好地重现您的输出
df_2
,没有任何错误。
df%>%filter(grepl(“N\\s”,String))
有效吗?这里您匹配了
“N”
加上一个空格。@Ragstock您的意思是
df%>%filter(grepl(“(N\\d+\N\\s)”,String))
?这将保留包含
“N”
加上数字或空格的条目。如果要排除,则为否定。该语法称为正则表达式(通常缩写为regexp或regex);是阅读的良好起点:-)不要将解决方案添加为问题的编辑。我很抱歉,但我的实际数据集要比这个复杂得多(N和No应该表示不同的东西——我的错!)。我会使用分离和聚集函数而不是我在第二段中使用的函数吗?我不确定我是否完全理解它给我的输出…对。。。真实数据非常有用。首先,
Na
值实际不可用,或者
Na
代表什么?我将修改我的答案,用新的dataNa表示钠-N表示氮。在另一篇文章中,我因为使用真实数据(太复杂)而被击倒,所以我试图简化,但看起来我在这里做得太过分了。奇怪的是,我总是更喜欢真实数据,只要它只是为了工作!看起来你正在处理的是海量数据,所以我可以看到你在做什么。我不太确定如何使这个工作正常。使用最初的简单示例,我不确定dply路由是什么,而基R只是:
sub(patt=“N(\\d{1,3}\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\$”,repl=“”,df$String)\\\\[1]“Y No”“Y”“Y”“Y”
m/z             Column

241             C15 H22 O Na                
265             C15 H15 N5 
301             C16 H22 O4 Na 
335             C19 H20 O4 Na           
441             C26 H42 O4 Na 
library(dplyr)
library(tidyr)

ID = c(1, 2, 3, 4)
String = c("Y N No", "Y", "Y No", "Y N")
String <- gsub(pattern = "No", "N", String)
df = data.frame(ID, String)

#Separate the String var
df_sep <- separate(df, col = String, into = c("R1", "R2", "R3"), sep = " ", extra = "merge")
#gather the columns
df_gat <- gather(df_sep, Cols, StrValue, R1:R3, -ID) 
#filter
filter(df_gat, StrValue == "N" | StrValue != "N")
library(dplyr)
library(tidyr)
#Separate the String var
df_sep <- separate(df, col = Column, into = c("E1", "E2", "E3", "E4"), sep = " ", extra = "merge")
#gather the columns, long data format
gather(df_sep, Cols, Element, E1:E4, -m.z) %>% select(m.z, Element) -> df_gat
#filter
filter(df_gat, !grepl("^N$|N\\d", df_gat$Element))
ID = c(1, 2, 3, 4)
String = c("Y N No", "Y", "Y No", "Y N")
df = data.frame(ID, String)
df %>% filter(!grepl("(N\\d+|N\\s)", String))

Output: [Y] [Y No]