2016-09-02 12 views
-1

データフレーム内の列のペアの関係をチェックしたいと思います。 ABが偶数列(2番目)に存在する場合、奇数列(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 
+2

は 'データです[、1:2] < - データ[、3:4] 'それを行う必要があります..? – Frank

+0

試してみましたか? http://stackoverflow.com/questions/28639040/in-r-compare-one-column-value-to-all-other-columns – amrrs

+0

同一の関数を使用して2つの列が同一であるかどうかを確認する方法 –

答えて

2

あなたが手の前に列の間のマッピングを知っていれば、この場合には、私は列3とペアの列1を想定すなわち、Map機能を試してみて、4列目とペアコラム2:

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 
+0

クールなので、この例では、Mapはmapplyと同じですか? – johnsonzhj

+1

です。 'Map'は' mapply(...、simplify = FALSE) 'に相当します。 – Psidom

関連する問題