有没有办法根据以特定字符串开头的列名对数据进行子集划分?我有一些列,比如说ABC_1 ABC_2 ABC_3XYZ_1, XYZ_2,XYZ_3.

如何仅基于包含上述文本部分(比如ABCXYZ)的列来子集我的df?我可以使用索引,但这些列在数据中过于分散,这就变成了太多的硬编码.

此外,我只想包含这些列中任何一列的值为>0的行,因此如果上面6列中的任何一列的行中有1,那么它将剪切到我的最终数据帧中.

推荐答案

data.frame的名字上试试grepl.grepl将正则表达式与目标匹配,如果找到匹配项,则返回TRUE,否则返回FALSE.这个函数是矢量化的,所以你可以传递一个字符串向量来匹配,你会得到一个返回的布尔值向量.

实例

#  Data
df <- data.frame( ABC_1 = runif(3),
            ABC_2 = runif(3),
            XYZ_1 = runif(3),
            XYZ_2 = runif(3) )

#      ABC_1     ABC_2     XYZ_1     XYZ_2
#1 0.3792645 0.3614199 0.9793573 0.7139381
#2 0.1313246 0.9746691 0.7276705 0.0126057
#3 0.7282680 0.6518444 0.9531389 0.9673290

#  Use grepl
df[ , grepl( "ABC" , names( df ) ) ]
#      ABC_1     ABC_2
#1 0.3792645 0.3614199
#2 0.1313246 0.9746691
#3 0.7282680 0.6518444

#  grepl returns logical vector like this which is what we use to subset columns
grepl( "ABC" , names( df ) )
#[1]  TRUE  TRUE FALSE FALSE

为了回答第二部分,我将生成子集数据.帧,然后制作一个向量,对行进行索引,以保持(逻辑向量)如下...

set.seed(1)
df <- data.frame( ABC_1 = sample(0:1,3,repl = TRUE),
            ABC_2 = sample(0:1,3,repl = TRUE),
            XYZ_1 = sample(0:1,3,repl = TRUE),
            XYZ_2 = sample(0:1,3,repl = TRUE) )

# We will want to discard the second row because 'all' ABC values are 0:
#  ABC_1 ABC_2 XYZ_1 XYZ_2
#1     0     1     1     0
#2     0     0     1     0
#3     1     1     1     0


df1 <- df[ , grepl( "ABC" , names( df ) ) ]

ind <- apply( df1 , 1 , function(x) any( x > 0 ) )

df1[ ind , ]
#  ABC_1 ABC_2
#1     0     1
#3     1     1

R相关问答推荐

feature_weights参数没有影响Xgboost

棒棒糖图表大小和线宽参数故障标签未出现

如何提高以键ID为列的表中键查找的效率?

查找满足SpatRaster中条件的单元格位置

如何替换R中数据集列中的各种字符串

R创建一个数据透视表,计算多个组的百分比

更改Heatmap Annotation对象的名称

MCMC和零事件二元逻辑回归

如何根据条件计算时差(天)

R:更新后无法运行控制台

selectInput不返回ALL,并将因子转换为shiny 的数字

单个轮廓重叠条的单独图例

R-更新面内部的栅格值

使用rest从header(h2,h3,table)提取分层信息

迭代到DataFrame列并获得成对的值列表(col1->;col2、col2->;col3、col3->;col4等)的正确方法.

R+reprex:在呈现R标记文件时创建可重现的示例

当每个变量值只能 Select 一次时,如何从数据框中 Select 两个变量的组合?

在点图上绘制置信度或预测区间ggplot2

按组内中位数分类

如何判断代码是否在R Markdown(RMD)上下文中交互运行?