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
但它不起作用,有什么问题?
答案 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