应用于每列,并将结果OR应用于R.

时间:2015-12-29 19:16:16

标签: r

我正在尝试从包含一堆字符串的列的startsWith包运行gdata。我想OR结果得到一个列表,用于索引包含以某个值开头的值的行。所以考虑一下:

     A       B      C
1:  hello   jello  fello
2:  hello   hello  hello
3:  hello   hello  hello
4:  hello   hello  hello
5:  jello   hello  hello
6:  mello   hello  hello

我想查找所有以jel开头的条目的行,结果为T,F,F,F,T,F。有没有办法做到这一点,不需要for?我考虑过的方法是逐个遍历列和|它们。但我觉得必须有更好的方法吗?

5 个答案:

答案 0 :(得分:2)

您可以使用applyany

执行此操作
apply(Dt, 1, function(x) any(startsWith(x, "jel")))
#[1]  TRUE FALSE FALSE FALSE  TRUE FALSE
Dt <- fread("
     A       B      C
hello   jello  fello
hello   hello  hello
hello   hello  hello
hello   hello  hello
jello   hello  hello
mello   hello  hello",
header = TRUE)

答案 1 :(得分:1)

我认为你应该考虑使用grep函数,而不是使用函数startwith,它可以很容易地查找任何模式作为字符串的开头。因此,以您的数据表为例:

DT <- data.table(A = c(rep("hello", 4), "jello", "mello"), B = c("jello", rep("hello", 5)), C = c("fello", rep("hello", 5)))
DT

输出

       A     B     C
1: hello jello fello
2: hello hello hello
3: hello hello hello
4: hello hello hello
5: jello hello hello
6: mello hello hello

我们现在可以使用这种方式:

logicalList <- apply(DT, 1, function(x) { t <- grep("^jel",x); as.logical(sum(t))})
logicalList

输出

[1]  TRUE FALSE FALSE FALSE  TRUE FALSE

&#34; 1&#34;在apply函数中意味着我们正在应用每行下一个函数 &#34; ^&#34;在grep里面意味着我们只想要以&#34; jel&#34;开头的字符串。这是你需要的开始部分。
logicalList是一个包含所需条目的向量。

答案 2 :(得分:1)

我会使用public void play(Uri uri) { Intent intent = new Intent(); intent.setAction(android.content.Intent.ACTION_VIEW); intent.setDataAndType(uri, "audio/*"); startActivity(intent); } grepl(这种方法是矢量化的,可以避免在R中调用rowSumsapply

for

编辑:已添加基准。

矢量化方法最快(取决于行数):

d <- read.table(textConnection("
     A       B      C
1:  hello   jello  fello
2:  hello   hello  hello
3:  hello   hello  hello
4:  hello   hello  hello
5:  jello   hello  hello
6:  mello   hello  hello"), stringsAsFactors=FALSE)

l <- grepl("^jel", as.matrix(d))
#  [1] FALSE FALSE FALSE FALSE  TRUE FALSE  TRUE FALSE FALSE FALSE FALSE FALSE
# [13] FALSE FALSE FALSE FALSE FALSE FALSE

# turn logical vector l into a matrix
l <- matrix(l, nrow=nrow(d), ncol=ncol(d))
#       [,1]  [,2]  [,3]
# [1,] FALSE  TRUE FALSE
# [2,] FALSE FALSE FALSE
# [3,] FALSE FALSE FALSE
# [4,] FALSE FALSE FALSE
# [5,]  TRUE FALSE FALSE
# [6,] FALSE FALSE FALSE

# more than one "jel" per row?
rowSums(l) > 0L
# [1]  TRUE FALSE FALSE FALSE  TRUE FALSE

答案 3 :(得分:1)

这是一个结合了目前为止建议的几个答案的选项,但是使用 D > S ubsets以更多数据。 /strong>ata.table col umn s ,无需创建其他对象。

library(data.table)

Dt <- fread("
        A       B      C
        hello   jello  fello
        hello   hello  hello
        hello   hello  hello
        hello   hello  hello
        jello   hello  hello
        mello   hello  hello",
        header = TRUE)

Dt[, index := apply(X = .SD, MARGIN = 1,
                    FUN = function(x)as.logical(sum(grep("^jel",x)))),
   .SDcols = c("A", "B", "C")]

Dt # row index is available directly

答案 4 :(得分:0)

我会按照

的方式做点什么
bar <- structure(list(A = structure(c(1L, 1L, 1L, 1L, 2L, 3L), .Label = c("hello", 
"jello", "mello"), class = "factor"), B = structure(c(2L, 1L, 
1L, 1L, 1L, 1L), .Label = c("hello", "jello"), class = "factor"), 
    C = structure(c(1L, 2L, 2L, 2L, 2L, 2L), .Label = c("fello", 
    "hello"), class = "factor")), .Names = c("A", "B", "C"), class = "data.frame", row.names = c("1:", 
"2:", "3:", "4:", "5:", "6:"))

(
foo <- subset(bar, grepl("j", A)  | grepl("j", B)  | grepl("jel", C))
)

#>       A     B     C
#>1: hello jello fello
#>5: jello hello hello