我想检查数据框中列对的关系,例如。如果在偶数列(第2个)中存在'AB',则我将偶数列中的该特定值替换为奇数列(第1个)中的观察值。如果我想在多对列中进行相同的操作(第1对第2对,第3对第4对等等),我可以手动完成,就像我在下面写的那样,但是如果我有10对像这样的列,我如何以有效的方式做到这一点,例如使用sapply
?
##generate demo data
data<-data.frame(a<-c(1:5),
b<-c(1,2,'AC','ABAB',4),
c<-c(2:6),
d<-c(2,3,5,'BC','AB')
,stringsAsFactors = F)
data[,c(1,3)]<-sapply(data[,c(1,3)],as.character)
names(data)<-letters[1:4]
str(data)
##manual version
indx<-!grepl('[^AB]', data$c)
data$a[indx]<-data$c[indx]
indx<-!grepl('[^AB]', data$d)
data$b[indx]<-data$d[indx]
data
# a b c d
# 1 1 1 2 2
# 2 2 2 3 3
# 3 3 AC 4 5
# 4 4 ABAB 5 BC
# 5 5 AB 6 AB
答案 0 :(得分:2)
如果您事先知道列之间的映射,请尝试使用Map
函数,即在这种情况下,我假设第1列与第3列配对,第2列与第4列配对:
data[1:2] = Map(function(x, y) ifelse(!grepl("[^AB]", y), y, x), data[1:2], data[3:4])
data
# a b c d
#1 1 1 2 2
#2 2 2 3 3
#3 3 AC 4 5
#4 4 ABAB 5 BC
#5 5 AB 6 AB