如何使用向量化函数检查数据框中的列
How to use vectorized function to check across columns in data frame
我想检查数据框中成对列的关系,例如。如果偶数列(第 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
如果您事先知道列之间的映射,请尝试使用 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
我想检查数据框中成对列的关系,例如。如果偶数列(第 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
如果您事先知道列之间的映射,请尝试使用 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