我有两个数据框:
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
答案 0 :(得分:4)
使用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)
答案 1 :(得分:1)
我建议使用dplyr包。如果您使用它,则可以选择要加入的列。加入时,您应使用semi_join
代替inner_join
。区别在于inner_join
保留所有组合并可能重复行(&#34;如果x和y之间存在多个匹配,则返回所有匹配组合。&#34;)
semi_join
:&#34;半连接与内连接不同,因为内连接将为y的每个匹配行返回一行x,其中半连接将永远不会重复x行。&#34;
对于您的情况,您可以使用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
答案 2 :(得分:1)
#now keeps unique values for Syllable and the Pitch Values
df1 <- df1[order(df1$Syllable),]
df4<-merge(df2,df1)
df5<-df4[!duplicated(df4$Syllable),]