使用少数特定列上的条件对R中的数据帧进行子集

使用少数特定列上的条件对R中的数据帧进行子集,r,dataframe,subset,R,Dataframe,Subset,我在R中有一个数据帧 id name class x101 x202 x303 76978 phil 2 0.407034783 0.001 0.192229687 59911 jose 2 0.327173661 0.004 0.227843273 46537 matt 3 0.590337464 0.005 0.057271545 77345 benn 4 0.293847569 0.002 0.170405643 53180 crai 2 0.844581456 0.0

我在R中有一个数据帧

id   name  class   x101   x202   x303

76978 phil 2 0.407034783 0.001 0.192229687
59911 jose 2 0.327173661 0.004 0.227843273
46537 matt 3 0.590337464 0.005 0.057271545
77345 benn 4 0.293847569 0.002 0.170405643
53180 crai 2 0.844581456 0.003 0.253665748
21063 lour 4 0.080756674 0.002 0.902143356
35456 moni 4 0.445965164 0.004 0.531952568
我需要删除以“x”(x101、x202和x303)开头且平均值小于0.1的列。将删除列X202。最终,我的输出应该如下所示:

id   name  class   x101   x303

76978 phil 2 0.407034783 0.192229687
59911 jose 2 0.327173661 0.227843273
46537 matt 3 0.590337464 0.057271545
77345 benn 4 0.293847569 0.170405643
53180 crai 2 0.844581456 0.253665748
21063 lour 4 0.080756674 0.902143356
35456 moni 4 0.445965164 0.531952568

如何在R中执行此操作?

这需要根据您拥有的数据帧进行调整(例如,如果您有更多列),但其工作原理与您的示例相同:

cbind(df[,1:3], df[,4:6][colMeans(df[,4:6]) > 0.1])
但是,使用
grepl
可以自动选择以“x”开头的列作为一个基线R一行的列:

cbind(df[,!grepl("x", colnames(df))], df[,grepl("x", colnames(df))][colMeans(df[,grepl("x", colnames(df))]) > 0.1])


这个脚本的剖析:这是告诉它连接那些不以“x”开头的列(
cbind
)(
df[,!grepl(“x”,colnames(df))]
)和那些以“x”开头的列(
df[,grepl(“x”,colnames(df))][colMeans df[,grepl(“x”,colnames(df))]>0.1]
).

在base R中,您可以执行以下操作

inx <- which(sapply(dat, inherits, "numeric"))
inx <- names(dat[inx])[grepl("x", names(dat[inx])) & colMeans(dat[inx]) < 0.1]
result <- dat[-which(names(dat) %in% inx)]
result 
#     id name class       x101       x303
#1 76978 phil     2 0.40703478 0.19222969
#2 59911 jose     2 0.32717366 0.22784327
#3 46537 matt     3 0.59033746 0.05727155
#4 77345 benn     4 0.29384757 0.17040564
#5 53180 crai     2 0.84458146 0.25366575
#6 21063 lour     4 0.08075667 0.90214336
#7 35456 moni     4 0.44596516 0.53195257

inx我建议使用
dplyr
包来实现这一点

    tmp<-read.table(text="id   name  class   x101   x202   x303
76978 phil 2 0.407034783 0.001 0.192229687
59911 jose 2 0.327173661 0.004 0.227843273
46537 matt 3 0.590337464 0.005 0.057271545
77345 benn 4 0.293847569 0.002 0.170405643
53180 crai 2 0.844581456 0.003 0.253665748
21063 lour 4 0.080756674 0.002 0.902143356
35456 moni 4 0.445965164 0.004 0.531952568",header=TRUE)

select_if(tmp,function(x) ((is.numeric(x) & mean(x) > 0.1)|!is.numeric(x)))
你也可以这样做:

keep <- !colnames(df) %in% names(which(sapply(df[startsWith(colnames(df), 'x')], mean) < 0.1))
(df <- df[keep])

这是一个多步骤的方法:

  • 通过
    startsWith(colnames(df),'x')
    获取以
    x开头的列
  • 使用
    sapply
    sapply(df[startsWith(colnames(df),'x')],mean)对这些数据帧进行子集划分,并计算每个数据帧的平均值
    
  • 通过
    which
    检查平均值并获得名称:
    names(which(sapply(df[startsWith(colnames(df),'x')),mean)<0.1))
  • 最后,这些是我们不想要的列,因此
    !colnames(df)%in%…
  • x[,-(其中col表示(x[,grepl(“x”,colnames(x)))
    
         id name class       x101       x303
    1 76978 phil     2 0.40703478 0.19222969
    2 59911 jose     2 0.32717366 0.22784327
    3 46537 matt     3 0.59033746 0.05727155
    4 77345 benn     4 0.29384757 0.17040564
    5 53180 crai     2 0.84458146 0.25366575
    6 21063 lour     4 0.08075667 0.90214336
    7 35456 moni     4 0.44596516 0.53195257
    
    keep <- !colnames(df) %in% names(which(sapply(df[startsWith(colnames(df), 'x')], mean) < 0.1))
    (df <- df[keep])
    
         id name class       x101       x303
    1 76978 phil     2 0.40703478 0.19222969
    2 59911 jose     2 0.32717366 0.22784327
    3 46537 matt     3 0.59033746 0.05727155
    4 77345 benn     4 0.29384757 0.17040564
    5 53180 crai     2 0.84458146 0.25366575
    6 21063 lour     4 0.08075667 0.90214336
    7 35456 moni     4 0.44596516 0.53195257