2017-09-28 40 views
0

我想根據行號將數據幀中的字符串(數字'2')替換爲不同的數據幀。這是我輸入:用字符替換數字,具體取決於數據幀的行

df <- "2 2 2 3 
     3 3 2 1" 
df <- read.table(text=df) 

這將是我的預期輸出:

dfout <- "1R 1R 1R 3 
     3 3 2R 1" 
dfout <- read.table(text=df) 

因此,數字「2」,應通過「1R」的第一行中的替代,通過「2R」的第二行等在較大的矩陣(我的真實數據有超過1000行)。我試了下面的代碼沒有成功:

apply(g1x, 1, function(x) gsub("2", nrow(x), x)) 

我會很高興在這裏的任何幫助。

+0

在我的例子,我有兩行,第一行我想換成「2」由「1R」,第二行的替代「2」通過' 2R'等。爲了清晰起見,我更新了問題。 – user3091668

+0

@Sotos - 當然,'gsub'會接受函數,如果它們給出正確的值 - 'apply(df,1,function(x)gsub(「2」,length(x),x))''。 – thelatemail

+0

@thelatemail,我認爲他們必須使用'gsubfn'(認爲這是它的目的)。也許我衝了... – Sotos

回答

0

使用data.table

library(data.table) 

df <- "2 2 2 3 
     3 3 2 1" 
df <- data.table(read.table(text=df)) 

mycols <- names(df) 
df[, (mycols) := lapply(.SD, function(x) ifelse(x==2, paste0(df[,.I], "R"),x)), .SDcols = mycols] 
3

下面是使用從基礎R sapply一個想法,

as.data.frame(t(sapply(seq(nrow(df)), function(i) 
             replace(df[i,], df[i,] == 2, paste0(i, 'R'))))) 

其給出,

V1 V2 V3 V4 
1 1R 1R 1R 3 
2 3 3 2R 1 
4

的變化上@sotos'答案:

replace(df, df==2, paste0(row(df)[df==2], "R") 

# V1 V2 V3 V4 
#1 1R 1R 1R 3 
#2 3 3 2R 1 

相當於替換形式:

df[df==2] <- paste0(row(df)[df==2], "R") 
+0

不錯!不知道'行' – Sotos

1

這裏是作爲使用which與arr.ind論點基R法。它的精神類似於電郵的方法。

pos <- which(df == 2, arr.ind=TRUE) 
df[pos] <- paste0(pos[,1], "R") 

這將返回

df 
    V1 V2 V3 V4 
1 1R 1R 1R 3 
2 3 3 2R 1