如何使用矢量化函数来检查数据框中的列

时间:2016-09-02 14:14:22

标签: r sapply

我想检查数据框中列对的关系,例如。如果在偶数列(第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

1 个答案:

答案 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