我正在尝试从包含一堆字符串的列的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
?我考虑过的方法是逐个遍历列和|
它们。但我觉得必须有更好的方法吗?
答案 0 :(得分:2)
您可以使用apply
和any
:
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中调用rowSums
或apply
:
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