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

R 根据匹配列和不匹配列的组合选择行

R 根据匹配列和不匹配列的组合选择行,r,data.table,subset,R,Data.table,Subset,我有一张这样的桌子: data <- data.frame(a = c("0/0", "0/1", "0/0", "0/0" ), b = c("0/1", "./.", "0/1", "0/0"), c = c("1/0", "0/0", "1/1", "0/0"), d = c("1/0", "0/0", "1/1", "0/0"),

我有一张这样的桌子:

 data <- data.frame(a = c("0/0", "0/1", "0/0", "0/0" ),
                    b = c("0/1", "./.", "0/1", "0/0"),
                    c = c("1/0", "0/0", "1/1", "0/0"),
                    d = c("1/0", "0/0", "1/1", "0/0"),                       
                    f = c("L", "L", "T", "L"))
但它不起作用

该表如下所示:

       a   b   c   d   f
    1 0/0 0/1 1/0 1/0  L
    2 0/1 ./. 0/0 0/0  L
    3 0/0 0/1 1/1 1/1  T
    4 0/0 0/0 0/0 0/0  L
       a   b   c   d   f
    1 0/0 0/1 1/0 1/0  L
所需的输出应如下所示:

       a   b   c   d   f
    1 0/0 0/1 1/0 1/0  L
    2 0/1 ./. 0/0 0/0  L
    3 0/0 0/1 1/1 1/1  T
    4 0/0 0/0 0/0 0/0  L
       a   b   c   d   f
    1 0/0 0/1 1/0 1/0  L

你知道我是如何做到这一点的吗?

这绝不比工作data.table解决方案快,但它适用于base R:

dat <- data.frame(a = c("0/0", "0/1", "0/0", "0/0" ),
                   b = c("0/1", "./.", "0/1", "0/0"),
                   c = c("1/0", "0/0", "1/1", "0/0"),
                   d = c("1/0", "0/0", "1/1", "0/0"),                       
                   f = c("L", "L", "T", "L"))

dat
f <- which(colnames(dat) == 'f')
rows <- apply(dat, 1, function(x)  x[f] == "L" & !any("./." == x[-f]) & any("0/1" == x[-f]) | any("1/0" == x[-f]) )
dat[rows,]

它使用apply函数在数据上逐行应用函数。

这决不比工作数据表解决方案快。但这适用于base R:

dat <- data.frame(a = c("0/0", "0/1", "0/0", "0/0" ),
                   b = c("0/1", "./.", "0/1", "0/0"),
                   c = c("1/0", "0/0", "1/1", "0/0"),
                   d = c("1/0", "0/0", "1/1", "0/0"),                       
                   f = c("L", "L", "T", "L"))

dat
f <- which(colnames(dat) == 'f')
rows <- apply(dat, 1, function(x)  x[f] == "L" & !any("./." == x[-f]) & any("0/1" == x[-f]) | any("1/0" == x[-f]) )
dat[rows,]

它使用应用函数在数据上按行应用函数。

类似于前面的答案:

apply(data[, 1:4], 1, function(a) any(a %in% c("0/1","1/0")) && !any(a[1:3] == "./.")) & data$f == "L"

与前面的答案类似:

apply(data[, 1:4], 1, function(a) any(a %in% c("0/1","1/0")) && !any(a[1:3] == "./.")) & data$f == "L"
细分:

sapply(data[1:4], `%in%`, c('0/1','1/0'))
#          a     b     c     d
# [1,] FALSE  TRUE  TRUE  TRUE
# [2,]  TRUE FALSE FALSE FALSE
# [3,] FALSE  TRUE FALSE FALSE
# [4,] FALSE FALSE FALSE FALSE
这为我们提供了前四列中的实例,其中有两个想要的模式之一。我们需要任何列所在的行,因此我们需要跨越它们:

apply(sapply(data[1:4], `%in%`, c('0/1','1/0')), 1, any)
# [1]  TRUE  TRUE  TRUE FALSE
同样,找到那些不想要的模式:

sapply(data[1:3], Negate(`%in%`), c('./.'))
#         a     b    c
# [1,] TRUE  TRUE TRUE
# [2,] TRUE FALSE TRUE
# [3,] TRUE  TRUE TRUE
# [4,] TRUE  TRUE TRUE
apply(sapply(data[1:3], Negate(`%in%`), c('./.')), 1, all) # notice "all", not "any"
# [1]  TRUE FALSE  TRUE  TRUE
现在我们希望最后一列中的L==L,直接向前,用&来逻辑地链接它们

细分:

sapply(data[1:4], `%in%`, c('0/1','1/0'))
#          a     b     c     d
# [1,] FALSE  TRUE  TRUE  TRUE
# [2,]  TRUE FALSE FALSE FALSE
# [3,] FALSE  TRUE FALSE FALSE
# [4,] FALSE FALSE FALSE FALSE
这为我们提供了前四列中的实例,其中有两个想要的模式之一。我们需要任何列所在的行,因此我们需要跨越它们:

apply(sapply(data[1:4], `%in%`, c('0/1','1/0')), 1, any)
# [1]  TRUE  TRUE  TRUE FALSE
同样,找到那些不想要的模式:

sapply(data[1:3], Negate(`%in%`), c('./.'))
#         a     b    c
# [1,] TRUE  TRUE TRUE
# [2,] TRUE FALSE TRUE
# [3,] TRUE  TRUE TRUE
# [4,] TRUE  TRUE TRUE
apply(sapply(data[1:3], Negate(`%in%`), c('./.')), 1, all) # notice "all", not "any"
# [1]  TRUE FALSE  TRUE  TRUE
现在,我们希望最后一列中的L==L,直接向前,用&.

另一个选项逻辑地链接它们:

data[f=="L", .SD[apply((.SD=="1/0" | .SD=="0/1") & !apply(.SD=="./.",1,any), 1, any)], 
    .SDcols=c("a","b","c","d")]
另一种选择:

data[f=="L", .SD[apply((.SD=="1/0" | .SD=="0/1") & !apply(.SD=="./.",1,any), 1, any)], 
    .SDcols=c("a","b","c","d")]

下面是一个使用apply from base R的简单解决方案-

test <- apply(data, 1, function(x) {
  any(x %in% c("0/1", "1/0")) & !any(x == "./.") & x["f"] == "L"
})

data[test, ]

#     a   b   c   d f
# 1 0/0 0/1 1/0 1/0 L

下面是一个使用apply from base R的简单解决方案-

test <- apply(data, 1, function(x) {
  any(x %in% c("0/1", "1/0")) & !any(x == "./.") & x["f"] == "L"
})

data[test, ]

#     a   b   c   d f
# 1 0/0 0/1 1/0 1/0 L

可以首先将列a、b、c和d连接在一起

data[, abcd := paste(a, b, c, d)]
然后,我将创建另一个新专栏,告诉我是否满足条件。我先把它设为全假

接下来,仅为满足条件的列指定TRUE

1在a、b、c或d中具有0/1或1/0,或仅为abcd

2没有。在abcd中

3在f列中有L

从这里,我可以选择

data[(Selection), ]

可以首先将列a、b、c和d连接在一起

data[, abcd := paste(a, b, c, d)]
然后,我将创建另一个新专栏,告诉我是否满足条件。我先把它设为全假

接下来,仅为满足条件的列指定TRUE

1在a、b、c或d中具有0/1或1/0,或仅为abcd

2没有。在abcd中

3在f列中有L

从这里,我可以选择

data[(Selection), ]

如果f或/.中有0/1,这将无法按预期工作。在d中。如果f或/.中有0/1,则这将不会像预期的那样起作用。如果其中一个答案回答了你的问题,请;这样做不仅给回答者提供了一些观点,也为有类似问题的读者提供了一些结尾。虽然你只能接受一个答案,但你可以选择增加你认为有帮助的选票。如果仍然存在问题,您可能需要编辑您的问题并提供更多详细信息。如果其中一个答案解决了您的问题,请;这样做不仅给回答者提供了一些观点,也为有类似问题的读者提供了一些结尾。虽然你只能接受一个答案,但你可以选择增加你认为有帮助的选票。如果仍然存在问题,您可能需要编辑问题并提供更多详细信息。