使用取决于数据框行的应用替换字符数

时间:2017-09-28 09:51:19

标签: r replace apply gsub

我想根据行号以不同的方式替换数据帧中的字符串(在我的示例中为数字'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))

我很高兴在这里提供任何帮助。

4 个答案:

答案 0 :(得分:4)

@ sotos&#39;的变种回答:

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")

答案 1 :(得分: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

答案 2 :(得分:1)

这是使用带有arr.ind参数的which的基本R方法。它在精神上与thelatemail的方法类似。

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

答案 3 :(得分: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]