Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/70.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 - Fatal编程技术网

比较R中同一列中的值

比较R中同一列中的值,r,R,我想比较R中同一列中的值。 我的数据集如下所示: F1 F2 F3 C300100 M1001 abc C300100 M1002 abc,def C300100 M1003 abc、def、ghi C300101 M1004 q C300101 M1005 q,r C300101 M1006 q、r、s C300101 M1007 a、b、c、d C30010111 C300101 abc C30010111 C300101 def,khy C30010199 cc c23 预期产出为: F1

我想比较R中同一列中的值。 我的数据集如下所示:

F1 F2 F3
C300100 M1001 abc
C300100 M1002 abc,def
C300100 M1003 abc、def、ghi
C300101 M1004 q
C300101 M1005 q,r
C300101 M1006 q、r、s
C300101 M1007 a、b、c、d
C30010111 C300101 abc
C30010111 C300101 def,khy
C30010199 cc c23

预期产出为:

F1 F2 F3 F4 C300100 M1001 abc真值
C300100 M1002 abc,def真值
C300100 M1003 abc、def、ghi真实值
C300101 M1004 q真值
C300101 M1005 q,r正确
C300101 M1006 q,r,s正确
C300101 M1007 a、b、c、d为假
C30010111 M1008 abc假 C30010111 C300101 def,khy假
C30010199 cc c23错误

在F1=A和F2=100的第一种情况下,因为F3=g出现在第二条记录和第三条记录中,所以它是真的

对于第二条记录,记录3中存在100g、hg和h,因此这是真的

我需要将第一张唱片与第二张和第三张唱片进行比较,以此类推, 然后第二次记录第三次,依此类推。 如果值存在于后续记录中,则为真,否则为假

是否有一个库和函数可以有效地做到这一点

非常感谢您的帮助

问候,,
A

您可以尝试这种基本R方法:

df$result <- unlist(sapply(split(df, df$F1), function(x) {
  n <- nrow(x)
  tmp <- strsplit(x$F3, ',')
  sapply(seq_len(n), function(x) all(sapply(tmp[min(x+1, n):n], 
                                            function(y) all(tmp[[x]] %in% y))))
}))

df

#         F1    F2          F3 result
#1   C300100 M1001         abc   TRUE
#2   C300100 M1002     abc,def   TRUE
#3   C300100 M1003 abc,def,ghi   TRUE
#4   C300101 M1004           q   TRUE
#5   C300101 M1005         q,r   TRUE
#6   C300101 M1006       q,r,s   TRUE
#7 C30010111 M1007     g,h,I,j  FALSE
#8 C30010111 M1008         abc   TRUE
#9 C30010199 M1009         c23   TRUE

df$result如果我们假设所有字母都用逗号和空格进行排序和分隔,那么您可以执行以下操作:

df$F4 <-  sapply(1:nrow(df), function(x) all(grepl(df$F3[x], tail(df$F3,-x))))
df
  F1  F2    F3   F4
1  A 100     a TRUE
2  A 100   a,b TRUE
3  A 100 a,b,c TRUE

df$F4我们可以使用
stru-detect

library(dplyr)
library(stringr)
df %>%
     mutate(F4 =  str_detect(F3, lag(F3, default = first(F3))))
#   F1  F2    F3   F4
# 1  A 100     a TRUE
# 2  A 100   a,b TRUE
# 3  A 100 a,b,c TRUE
数据
df Hi Akrun,第一个值始终为真。如果我们查看此表:F1 F2 F3 C300100 M1001 abc C300100 M1002 abc,def C300100 M1003 abc,def,ghi C300101 M1004 q C300101 M1005 q,r C300101 M1006 q,r,s C300101 M1007 a,b,c,d C30010111 C300101 abc C30010111 C300111 def,khy C30010199 cc c23 df%>%group by by(F1)%%>%关于整体的一些问题dataset@user13472171每组中的最后一个值(
F1
)应始终为真,对吗?你能检查一下更新后的答案是否更接近你的需要吗。
df <- structure(list(F1 = c("A", "A", "A"), F2 = c(100L, 100L, 100L
), F3 = c("a", "a,b", "a,b,c")), 
   row.names = c(NA, -3L), class = "data.frame")