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中是否有更多_R_Parsing - Fatal编程技术网

解析,然后检查R中是否有更多

解析,然后检查R中是否有更多,r,parsing,R,Parsing,这是我的数据框中的三个特定列。我已经解析了name列,并根据其他值对它们进行排序。我现在正试图解析并获取具有第三个数字和第三个冒号的,然后将其余的移到底部 以下是我对该示例的预期输出: Name Parsed Rank WBA-Y*08:03:01 WBA-Y*08:03 1 WBA-Y*08:169 WBA-Y*08:169 2 WBA-Y*08:03:15 WBA-Y*08:03 3 WBA-Y*08

这是我的数据框中的三个特定列。我已经解析了name列,并根据其他值对它们进行排序。我现在正试图解析并获取具有第三个数字和第三个冒号的,然后将其余的移到底部

以下是我对该示例的预期输出:

    Name             Parsed      Rank
WBA-Y*08:03:01    WBA-Y*08:03      1
WBA-Y*08:169      WBA-Y*08:169     2
WBA-Y*08:03:15    WBA-Y*08:03      3
WBA-Y*08:03:02    WBA-Y*08:03      4
由于WBA-Y*08:169只有两个数字和一个冒号,因此将移到底部。我该怎么做?我可以使用gsub或sub吗

    Name             Parsed      Rank
WBA-Y*08:03:01    WBA-Y*08:03      1
WBA-Y*08:03:15    WBA-Y*08:03      2
WBA-Y*08:03:02    WBA-Y*08:03      3
WBA-Y*08:169      WBA-Y*08:169     4

如果您想删除
v_Name
,可以在末尾添加
%%>%select(-v_Name)

这里有一个
base R
选项来修复它。使用
grepl
检查在“名称”列中字符串的末尾(
$
)有无两位数字后跟
两次后跟一个或多个数字的模式,使用此选项对第一列和第二列进行
排序并更新这些列

df = read.table(text = "
Name             Parsed      Rank
WBA-Y*08:03:01    WBA-Y*08:03      1
WBA-Y*08:169      WBA-Y*08:169     2
WBA-Y*08:03:15    WBA-Y*08:03      3
WBA-Y*08:03:02    WBA-Y*08:03      4
", header=T, stringsAsFactors=F)

library(tidyverse)

df %>%
  mutate(v_Name = str_count(Name, ":")) %>%  # count how many : you have for each Name value
  arrange(desc(v_Name)) %>%                  # arrange descending by those counts
  mutate(Rank = row_number())                # update rank to be the row number

#             Name       Parsed Rank v_Name
# 1 WBA-Y*08:03:01  WBA-Y*08:03    1      2
# 2 WBA-Y*08:03:15  WBA-Y*08:03    2      2
# 3 WBA-Y*08:03:02  WBA-Y*08:03    3      2
# 4   WBA-Y*08:169 WBA-Y*08:169    4      1

df[1:2]如果格式是这样的,那么您可以简单地计算每个值的
。正如1
表示2个数字,2
表示3个数字,等等。对吗?UseMethod中的错误(“mutate_”):没有适用于“function”类对象的“mutate_”方法,因为v_Name存储的函数是正确的,所以这是没有意义的?当您尝试运行此示例或完整的数据集时,这是一个错误吗?这是一个很好的观点,我认为这是我的完整数据集,我将再次尝试此功能,非常有效,谢谢!你能给我解释一下这部分“(\\d{2}:){2}\\d+$”吗?还有,为什么它只减去grepl而不是grepl?@nathan默认情况下,
order
按照从
grepl
派生的逻辑向量的字母顺序,即
FALSE
后跟
TRUE
。我们可以使用
discreating=TRUE
参数(默认值为
FALSE
)或
-
来更改顺序。
\\d{2}
是两个数字,后面跟着
因为它重复了两次,所以我们将它用括号括起来并使用
{2}
df[1:2] <- df[order(-grepl("(\\d{2}:){2}\\d+$", df$Name)), 1:2]
df
#            Name       Parsed Rank
#1 WBA-Y*08:03:01  WBA-Y*08:03    1
#2 WBA-Y*08:03:15  WBA-Y*08:03    2
#3 WBA-Y*08:03:02  WBA-Y*08:03    3
#4   WBA-Y*08:169 WBA-Y*08:169    4
df <- structure(list(Name = c("WBA-Y*08:03:01", "WBA-Y*08:169", "WBA-Y*08:03:15", 
"WBA-Y*08:03:02"), Parsed = c("WBA-Y*08:03", "WBA-Y*08:169", 
"WBA-Y*08:03", "WBA-Y*08:03"), Rank = 1:4), .Names = c("Name", 
"Parsed", "Rank"), class = "data.frame", row.names = c(NA, -4L))