2016-11-11 10 views
1

"。"で区切られた数字と数字を含むデータフレームがあります。 "。"に依存するエントリを変更したい文字列。 エントリに "。"が含まれていない場合接頭辞「 - 」を追加する必要があります。これは、サブセッティングまたはgrep機能を使用することで簡単です。しかし、私はまた、 "。" "。"のカウンターで。R - 特定の文字列でデータフレームのエントリを変更する(カウンタの値で置き換え、カウンタの値で置き換えます)

私の例のデータ:

X1  X2 
1  2 
3  4 
6  8 
5  1.2 
3.4  7 
1.2.5 9 
11  3.4.7 

と私はそれがこのように見えるがしたい:

X1  X2 
-1  -2 
-3  -4 
-6  -8 
-5  1 
2  -7 
3  -9 
-11  4 

私は見当もつかないし、すでに抽出し、サブセット化しようとしました「」それらを数える部品。しかし、私はカウンターを挿入することはできません。ご協力いただきありがとうございます。

+0

です彼は3回目と4回目に "。"表示される – Miguel123

+0

はい私はそれを得た。下の私の答えを見てください – Sotos

+0

はい、ありがとう!私もサプリに慣れていませんが、:)素晴らしいソリューションです。あなたの質問によると、 "。"エントリの数をチェックし、その組み合わせが上に現れた行番号に置き換えたい場合、コードはどのように見えるでしょうか?それはつまり:1.2。 => 1、3.4 => 2、1.2.5 => 4,3.4.7 => 5? – Miguel123

答えて

2

を使用して、以下の行でそれを行う方法があるはずですベースRを経由してのアイデア、

ind <- rowSums(sapply(df, function(i) cumsum(grepl('\\.', i)))) 
df[] <- lapply(df[], function(i) ifelse(grepl('\\.', i), ind, paste0('-', i))) 

df 
# X1 X2 
#1 -1 -2 
#2 -3 -4 
#3 -6 -8 
#4 -5 1 
#5 2 -7 
#6 3 -9 
#7 -11 4 

NOTEがある:私はcharにdfを変換しましたアクター、

df[] <- lapply(df[], as.character) 

EDIT

あなたの行番号の要求に関しては、これは、その後、

ind1 <- apply(df, 1, function(i) paste(sort(i), collapse = '.')) 
df2 <- sapply(df, function(i) match(i, ind1)) 
df[] <- lapply(df[], function(i) ifelse(grepl('\\.', i), 0, paste0('-', i))) 
df[!is.na(df2)] <- df2[!is.na(df2)] 
df 
# X1 X2 
#1 -1 -2 
#2 -3 -4 
#3 -6 -8 
#4 -5 1 
#5 2 -7 
#6 4 -9 
#7 -11 5 

あなたは後でこのデータフレームで計算を行う上で計画している場合は、それを行う必要があります整数に変換する必要があります。つまり、

df[] <- lapply(df[], as.integer) 

str(df) 
#'data.frame': 7 obs. of 2 variables: 
# $ X1: int -1 -3 -6 -5 2 4 -11 
# $ X2: int -2 -4 -8 1 -7 -9 5 
0

ここではアイデアが一時的な列にカウンタを作成することですdata.table である:

library(data.table) 

dt<-data.table(df) 
dt$X1 <- as.character(dt$X1) 
dt$X2 <- as.character(dt$X2) 
dt[!grepl(".", dt$X1, fixed=TRUE),X1:=paste("-", X1, sep="") ] 
dt[!grepl(".", dt$X2, fixed=TRUE),X2:=paste("-", X2, sep="") ] 
dt[grepl(".", dt$X1, fixed=TRUE)|grepl(".", dt$X2, fixed=TRUE), count_point:=as.character(sequence(.N))] 
dt[grepl(".", dt$X1, fixed=TRUE),X1:=count_point] 
dt[grepl(".", dt$X2, fixed=TRUE),X2:=count_point] 
df <- data.frame(dt[, c("X1", "X2"), with = FALSE]) 

ここ.SD

+0

うわー、それは動作します。一時的な列について考えたことはありません... – Miguel123

関連する問題