2016-06-27 2 views
0

Предположим, у меня есть кадр данных с примерно 7 столбцами. В первом столбце содержится список чисел, а у других есть число, за которым следуют слова.Замена значения в одном столбце одним в другом на основе соответствия строки

Предположим, что номер говорит 15. Я хочу, чтобы R посмотрел на остальные 6 столбцов, найдите, у кого есть «15», и скопируйте содержимое этой записи в мой номер столбца.

Как это сделать?

EDIT: предположим, что при поиске R не будет многократных совпадений.

+0

Что произойдет, если несколько столбцов соответствуют числу? –

+0

Я забыл упомянуть об этом, но предположим, что это невозможно для нескольких матчей. – Exc

+0

Создайте небольшой пример, с которым мы можем работать –

ответ

2

Если я правильно понимаю ваши требования, вы можете использовать grep() с value=T на каждой строке независимо, передавая регулярное выражение, которое должно быть динамически построено из числа в первом столбце и перезаписывать столбец числа с результирующим вектором.

## generate data 
set.seed(1L); NR <- 5L; NC <- 7L; 
nums <- sample(seq_len(NR)); 
df <- data.frame(num=nums,t(sapply(nums,function(num) paste0(sample(if (NC-1L>=num) seq_len(NC-1L) else c(num,seq_len(NC-2L))),sample(letters,NC-1L,T))))); 
df; 
## num X1 X2 X3 X4 X5 X6 
## 1 2 6e 5r 3j 2u 1m 4s 
## 2 5 6d 2g 4k 3a 1j 5w 
## 3 4 3r 6u 5c 2s 1k 4v 
## 4 3 4m 6t 3s 2m 5w 1l 
## 5 1 2k 1x 5h 4l 6i 3q 

## solution 
df$num <- sapply(seq_len(nrow(df)),function(ri) grep(value=T,paste0('^',df$num[ri],'($|[^0-9])'),unlist(df[ri,-1L]))); 
## num X1 X2 X3 X4 X5 X6 
## 1 2u 6e 5r 3j 2u 1m 4s 
## 2 5w 6d 2g 4k 3a 1j 5w 
## 3 4v 3r 6u 5c 2s 1k 4v 
## 4 3s 4m 6t 3s 2m 5w 1l 
## 5 1x 2k 1x 5h 4l 6i 3q 

Предполагается, что каждое число соответствует точно одному значению столбца.