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