按名称

时间:2016-07-26 22:47:50

标签: arrays r data-manipulation

我需要操纵我的数组。 我有一个数组调用res,其中包含我的所有结果。 请参阅输入下方。

    RT   Max    blk24  blk23    mat23   sm23    sm24
1   1.6  261    13     19       19      27      20
2   1.6  284    NA     53       5       99      91
3   1.7  304    NA     NA       NA      81      NA
4   1.8  305    32     28       28      39      33
5   1.9  322    8      NA       NA      36      39
6   1.9  349    NA     NA       NA      24      17
7   2    389    1       3       NA      50      NA
8   2.1  393    80      70      7       12      71
9   2.1  622    NA      NA      15      97      96
10  2.2  705    NA      NA      NA      NA      32

我想根据列名blksm以及值本身的标准来提取数据。

对于blk,我建议这样做:

whereblk<- grep("^Blk", colnames(res))

for (i in 1:length(res)){
    tmp.res<-res[which(res[whereblk]>0),]
}

我得到的输出在RT时为我提供了Maxblk>0的所有值。

然后我想从sm列中提取值。我希望在smblk=NA时提取mat=NA值。

你有任何线索吗?

我想要的输出是:

    RT  Max         sm23    sm24
1   
2   
3   1.7 304         81      NA
4   
5   
6   1.9 349         24      17
7   
8   
9   
10  2.2 705         NA      32

要使用excel,可以使用以下公式,= IF(COUNTIF(blk:blk,&#34;&gt; 0&#34;),&#34; - &#34;,sm )。 excel的问题是,如果blk列的数量发生变化,我无法自动使用它。

这里的困难是使用根据其名称本地化列位置的公式。并根据我仍然不掌握的两个标准提取值。

如果您有任何建议,欢迎您。

2 个答案:

答案 0 :(得分:2)

这是一个base R选项Reducelapply(假设我们有一个data.frame或者data.frame转换为as.data.frame(m1) matrix } - 如果它是nm1 <- grep("blk|mat", names(df), value = TRUE) df[Reduce(`&`,lapply(df[nm1], is.na)), setdiff(names(df), nm1)] # RT Max sm23 sm24 #3 1.7 304 81 NA #6 1.9 349 24 17 #10 2.2 705 NA 32

SELECT A, B, C FROM TABLE WHERE STRCMP(D, 'somestring') > 0

答案 1 :(得分:1)

这是一个dplyr解决方案。

我相当确定@thelatemail提供了一个解决方案,可以在评论部分使用基本R。

Renderer