2013-12-03 4 views
0

У меня есть два набора данных, которые выглядят следующим образом:Изменение значения столбца для значений из другого столбца

http://i.stack.imgur.com/ROUiF.png

То, что я хочу, чтобы изменить значение из второго столбца в первом наборе данных в значения из второго столбца из второго набора данных. Все имена в первом наборе данных находятся во втором, и, очевидно, мой набор данных намного больше.

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

Мне также необходимо, чтобы порядок первых столбцов (имен) в первом наборе данных оставался неизменным, но с новыми значениями из второго столбца второго набора данных.

+0

'df1 $ <- df2 $ '? – TheComeOnMan

+0

@Codoremifa Это не сработает, потому что порядок двух наборов данных отличается. Если вы хотите это сделать, вам придется сначала сортировать первый столбец. – ialm

+1

Здесь вы можете использовать 'merge'. – agstudy

ответ

0
df1<- data.frame(name1 = letters[6:10], valuecol1=seq(2,10,by=2)) 
df2 <- data.frame(name2 = letters[1:10], valuecol2=10:1) 
df2 [ match(df1$name1, df2$name2) , "valuecol2"] <- df1[ df1$name1 %in% df2$name2 , "valuecol1"] 
df2 

    name2 valuecol2 
1  a  10 
2  b   9 
3  c   8 
4  d   7 
5  e   6 
6  f   2 
7  g   4 
8  h   6 
9  i   8 
10  j  10 

Это то, что я думал, что могло бы работать, но делать замены, используя индексацию с match иногда кусает меня способами, мне нужно настроить:

df2 [match(df1$name1, df2$name2) , "valuecol2"] <- 
          df1[ match(df1$name1, df2$name2) , "valuecol1"] 

Вот как я тестировал (под редакцией).

> df2 <- data.frame(name2 = letters[1:10], valuecol2=10:1) 
> df1<- data.frame(name1 = letters[1:5], valuecol1=seq(2,10,by=2)) 
> df2 [ match(df1$name1, df2$name2) , "valuecol2"] <- df1[ match(df1$name1, df2$name2) , "valuecol1"] 
> df2 
    name2 valuecol2 
1  a   2 
2  b   4 
3  c   6 
4  d   8 
5  e  10 
6  f   5 
7  g   4 
8  h   3 
9  i   2 
10  j   1 

Да .... укусила снова.

> df1<- data.frame(name1 = letters[6:10], valuecol1=seq(2,10,by=2)) 
> df2 [ match(df1$name1, df2$name2) , "valuecol2"] <- df1[ match(df1$name1, df2$name2) , "valuecol1"] 
> df2 
    name2 valuecol2 
1  a   2 
2  b   4 
3  c   6 
4  d   8 
5  e  10 
6  f  NA 
7  g  NA 
8  h  NA 
9  i  NA 
10  j  NA 
1

Согласитесь с @agstudy, простое использование слияния сделало бы трюк. Попробуйте что-то вроде этого:

df1 <- data.frame(name=c("ab23242", "ab35366", "ab47490", "ab59614"), 
       X=c(72722, 88283, 99999, 114278.333)) 

df2 <- data.frame(name=c("ab35366", "ab47490", "ab59614", "ab23242"), 
        X=c(12345, 23456, 34567, 456789)) 
df.merge <- merge(df1, df2, by="name", all.x=T) 
df.merge <- df.merge[, -2] 

Выход:

 name X.y 
1 ab23242 456789 
2 ab35366 12345 
3 ab47490 23456 
4 ab59614 34567 

Я думаю, что слияние будет держать порядок первого кадра, но вы также можете сохранить порядок строго, просто добавив столбец с порядком df1$order <- 1:nrow(df1) и позже при сортировке по этой колонке.

0

Как об этом:

library(data.table) 
# generate some random data 
dt.1 <- data.table(id = 1:1000, value=rnorm(1000), key="id") 
dt.2 <- data.table(id = 2*(500:1), value=as.numeric(1:500), key="id") 

# objective is to replace value in df.1 with value from df.2 where id's match. 
# data table joins - very efficient 
# dt.1 now has 3 columns: id, value, and value.1 from dt.2$value 
dt.1 <-dt.2[dt.1,nomatch=NA] 
dt.1[is.na(value),]$value=dt.1[is.na(value),]$value.1 
dt.1$value.1=NULL  # get rid of extra column 

NB: Это сортирует dt.1 по id, которые должны быть в порядке, так как он отсортирован, что путь уже.

Также: В дальнейшем, пожалуйста, укажите данные, которые могут быть импортированы в R. Изображения не полезны!

Смежные вопросы