Как выбрать строки из dataframe1 в R, где dataframe $ 1column находится где-то в dataframe2 $ column - PullRequest
1 голос
/ 07 апреля 2011

Мне нужно создать новый кадр данных из строк в dataframe1, чтобы значение столбца dataframe1 $ было значением, найденным в dataframe2 $ colum

датафреймы:

y <- "name,number,lunch  
joe,2,peaches  
steve,5,hotdog  
jon,7,clamroll  
nick,11,sloppyJoe"


x <- "number,office  
1,1b  
2,1a  
3,2s  
4,4d  
5,f4  
6,f4  
7,h3  
8,g3  
9,j7  
10,d3 
11,jk"  

df1 <- read.csv(textConnection(df1), header=TRUE, sep=",", stringsAsFactors=FALSE)  
df2 <- read.csv(textConnection(df2), header=TRUE, sep=",", stringsAsFactors=FALSE)

Я пробовал:

df3 <- df1[which(df1$number == df2$number), ]

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

Ответы [ 2 ]

5 голосов
/ 07 апреля 2011

снова, трюк %in%:

> df1[df1$number %in% df2$number,]
   number office
2       2     1a
5       5     f4
7       7     h3
11     11     jk

Для чего бы это ни стоило, вы можете легко сделать слияние, если хотите объединить их. В этом случае я бы сказал, что это самое чистое решение: предоставляет вам все офисы действующих сотрудников и сопоставляет их:

> merge(df1,df2)
  number office  name     lunch
1      2     1a   joe   peaches
2      5     f4 steve    hotdog
3      7     h3   jon  clamroll
4     11     jk  nick sloppyJoe

Проверьте файлы справки слияния для большего количества опций, вы можете многое сделать с ним.

1 голос
/ 07 апреля 2011

Ответ Джориса точен.Команда merge() также может быть полезна для такого типа вещей.Если вы знакомы с объединениями SQL, вы можете провести параллели между большинством параметров в merge() и различными операциями объединения.

#Inner join
> merge(df1,df2)
  number office  name      lunch
1      2   1a     joe  peaches  
2      5   f4   steve   hotdog  
3      7   h3     jon clamroll  
4     11     jk  nick  sloppyJoe

#Right join:
> merge(df1,df2, all.x = TRUE)
   number office  name      lunch
1       1   1b    <NA>       <NA>
2       2   1a     joe  peaches  
3       3   2s    <NA>       <NA>
4       4   4d    <NA>       <NA>
5       5   f4   steve   hotdog  
6       6   f4    <NA>       <NA>
7       7   h3     jon clamroll  
8       8   g3    <NA>       <NA>
9       9   j7    <NA>       <NA>
10     10    d3   <NA>       <NA>
11     11     jk  nick  sloppyJoe
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...