如何在r中仅用[]选择子集?

时间:2016-11-03 10:43:45

标签: r

a<-data.frame(q1=rep(c(1,'A','B'),4),q2=c(1,'A','B','C'),w1=c(1,'A','B','C'))

我想将q1,q2 !=1的元素转换为0,我只想使用[]。我相信所有子集都可以通过[ ]

a[grep("q\\d",colnames(a),perl=TRUE)!=1,grep("q\\d",colnames(a),perl=TRUE)]<-0

但它不起作用,有什么问题?

3 个答案:

答案 0 :(得分:2)

我们创建一个以'q'开头,后跟数字('nm1')的列名的数字索引,用它来对'a'中的列进行子集化,并在其中分配不等于1的值子集为0。

nm1 <- grep("q\\d+", names(a))
a[nm1][a[nm1] != 1] <- 0

并确保我们使用character

中的stringsAsFactors= FALSE将列设为data.frame

上述替换基于逻辑矩阵(a[nm1]!=1),如果数据集非常大,可能会产生内存问题。在这种情况下,最好循环使用列replace并使用0

a[nm1] <- lapply(a[nm1], function(x) replace(x, x!=1, 0))

数据

a <- data.frame(q1=rep(c(1,'A','B'),4),q2=c(1,'A','B','C'),
                 w1=c(1,'A','B','C'), stringsAsFactors=FALSE)

答案 1 :(得分:0)

以防万一,如果你知道列名,你可以使用它们进行索引。

a<-data.frame(q1=rep(c(1,'A','B'),4), q2=c(1,'A','B','C'),
   w1=c(1,'A','B','C'), stringsAsFactors=FALSE)

col_n <- c("q1", "q2")
a[, col_n][a[, col_n]!=1]<-0

> a
   q1 q2 w1
1   1  1  1
2   0  0  A
3   0  0  B
4   1  0  C
5   0  1  1
6   0  0  A
7   1  0  B
8   0  0  C
9   0  1  1
10  1  0  A
11  0  0  B
12  0  0  C

答案 2 :(得分:0)

data.table方法:

a<-data.table(q1=rep(c(1,'A','B'),4),q2=c(1,'A','B','C'),w1=c(1,'A','B','C'))

a[,grep("^q", colnames(a), value = T):=lapply(a[,grep("^q", colnames(a), value = T), with = F], function(x) ifelse(x == 1, 1, 0))]

> a
    q1 q2 w1
 1:  1  1  1
 2:  0  0  A
 3:  0  0  B
 4:  1  0  C
 5:  0  1  1
 6:  0  0  A
 7:  1  0  B
 8:  0  0  C
 9:  0  1  1
10:  1  0  A
11:  0  0  B
12:  0  0  C