Объединение двух фреймов данных с определенными условиями в R - PullRequest
0 голосов
/ 05 июня 2018

У меня есть два фрейма данных:

df1
Syllable Duration Pitch
@         0.08    93
@         0.05    107
@         0.13    56
@         0.07    95
@         0.07    123

df2
Syllable Duration 
@        0.08 
@        0.05 
@        0.07
@        0.07 

Я хочу объединить их в другой фрейм данных:

df3
Syllable Duration Pitch
@        0.08     93
@        0.05     107
@        0.07     95
@        0.07     123

Проблема состоит в том, что я повторил значения Syllable и Duration.Я пробовал этот код, но он дает мне неверный шаг:

df3 <- merge(df2, df1[!duplicated(df1$Syllable),], by="Syllable")

df3
Syllable Duration Pitch
@        0.08     93
@        0.05     93
@        0.07     93
@        0.07     93

Ответы [ 3 ]

0 голосов
/ 05 июня 2018

С data.table вы можете сделать:

library("data.table")
df1 <- fread(
"Syllable Duration Pitch
@ 0.08 93
@ 0.05 107
@ 0.13 56
@ 0.07 95
@ 0.07 123")
df2 <- fread(
"Syllable Duration 
@ 0.08 
@ 0.05 
@ 0.07
@ 0.07")
merge(df1, unique(df2))
# > merge(df1, unique(df2))
#    Syllable Duration Pitch
# 1:        @     0.05   107
# 2:        @     0.07    95
# 3:        @     0.07   123
# 4:        @     0.08    93

или без сортировки:

merge(df1, unique(df2), sort=FALSE)
# > merge(df1, unique(df2), sort=FALSE)
#    Syllable Duration Pitch
# 1:        @     0.08    93
# 2:        @     0.05   107
# 3:        @     0.07    95
# 4:        @     0.07   123

этот последний аналогичен:

df1[unique(df2), on=c("Syllable", "Duration")]
# > df1[unique(df2), on=c("Syllable", "Duration")]
#    Syllable Duration Pitch
# 1:        @     0.08    93
# 2:        @     0.05   107
# 3:        @     0.07    95
# 4:        @     0.07   123

Сбаза R:

df1 <- read.table(header=TRUE, text=
"Syllable Duration Pitch
@         0.08    93
@         0.05    107
@         0.13    56
@         0.07    95
@         0.07    123")

df2 <- read.table(header=TRUE, text=
"Syllable Duration 
@        0.08 
@        0.05 
@        0.07
@        0.07 ")
merge(df1, unique(df2))
merge(df1, unique(df2), sort=FALSE)
0 голосов
/ 05 июня 2018
#now keeps unique values for Syllable and the Pitch Values

df1 <- df1[order(df1$Syllable),]

df4<-merge(df2,df1)

df5<-df4[!duplicated(df4$Syllable),]
0 голосов
/ 05 июня 2018

Я бы предложил использовать пакет dplyr.Если вы используете его, вы можете выбрать столбцы, к которым вы хотите присоединиться.Когда вы присоединяетесь, вы должны использовать semi_join вместо inner_join.Разница заключается в том, что inner_join сохраняет все комбинации и, возможно, дублирует строки («Если есть несколько совпадений между x и y, возвращаются все комбинации совпадений».)

semi_join, с другой стороны, делает: «Полусоединение отличается от внутреннего соединения, потому что внутреннее соединение вернет одну строку x для каждой соответствующей строки y, где полусоединение никогда не будет дублировать строки x.»

Для вашего случая выможно использовать semi_join(df1, df2, by = c("Syllable", "Duration")) для объединения данных.Вектор by определяет имена столбцов, к которым вы хотите присоединиться.

Это дает вам то, что вы хотели:

  Syllable Duration Pitch
1        @     0.08    93 
2        @     0.05   107
3        @     0.07    95
4        @     0.07   123
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...