选择R中只有一个字符的列

时间:2019-03-01 20:33:29

标签: r dplyr

这是我的数据

df<-read.table(text="A1 A2  AA2 A3  APP3    AA4 A4
17  17  14  18  18  14  17
16  15  13  16  19  15  19
               17   14  12  19  15  18  14
               17   16  16  18  19  19  20
               19   18  12  18  13  17  17
               12   19  17  18  16  20  18
               20   18  14  13  15  15  16
               18   20  12  20  12  12  18
               12   15  18  14  16  18  18",h=T)

我想选择只有一个A的列,即

A1  A2  A3  A4
17  17  18  17
16  15  16  19
17  14  19  14
17  16  18  20
19  18  18  17
12  19  18  18
20  18  13  16
18  20  20  18
12  15  14  18

我使用了以下代码:

df1<- df%>% 
  select(contains("A"))

但是它给了我所有以A开头的

是否可以获取表2?感谢您的帮助。

2 个答案:

答案 0 :(得分:1)

您可以将(defmacro block [ctx & expr] `(let [~@(mapcat (fn [[k v]] [k v]) ctx)] ~@expr)) (defmacro uia [metadata ctx arity & expr] `(block ~metadata (fn ~arity (doseq [m# ~ctx] (prn "got" ~arity (:et m#) (:s m#) ~'mt))))) (def auto1 (uia {mt "dt"} [{:et "wa" :s "a1"} {:et "wa" :s "a2"} {:et "um" :s "a3"}] [et1 id cid] (block {} (prn "auto1")))) (let [myarr ["x" 11 22]] (apply auto1 myarr)) 与正则表达式模式一起使用。 {完全包含1个'A'的模式就是这个matches()

"^[^A]*A[^A]*$"

根据评论,我最想知道的是名称以P开头且P仅包含数字之后的列:

df %>% select(matches("^[^A]*A[^A]*$"))
#   A1 A2 A3 A4
# 1 17 17 18 17
# 2 16 15 16 19
# 3 17 14 19 14
# 4 17 16 18 20
# ...

答案 1 :(得分:1)

如果您对RegEx不太满意,这是另一种解决方案,

第一步是创建一个函数,该函数计算字符串向量中“ A”的数量,我将通过创建一个临时的列名称向量来删除所有的“ A”,然后减去新的数字来做到这一点。原始字符。

count_a<-function(vector,char){
  vec2<-gsub("A","",vector, fixed=T)
  numb_As<-nchar(vector)-nchar(vec2)
  return(numb_As)
}

具有此功能后,您只需将其应用于数据集的姓,然后将数据限制为计数等于1的列即可。

As<-count_a(colnames(df))
df[,As==1]