首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >R- text挖掘中的水平合并数据帧

R- text挖掘中的水平合并数据帧
EN

Stack Overflow用户
提问于 2020-09-18 00:55:00
回答 2查看 49关注 0票数 0

如何在R中水平合并/合并3个数据帧?我有三个数据帧,一列中有一个单词,下一列中从文本中提取的单词计数,有点像这样:

代码语言:javascript
复制
  word.        count
1 hello.         6
2 test.          3
3 how.           8
4 are.           4
5 you.           1

我们来看一下dataframe 2:

代码语言:javascript
复制
  word.        count
1 hello.         6
2 test.          3
3 i.             3
4 am.            6
5 good.          2

我如何像这样合并它们:

代码语言:javascript
复制
  word.         df1.     df2.      total
1 hello.         6.       6.         12
2 test.          3        3           6
3 how.           8        0.          8 
4 are.           4        0           4
5 you.           1        0           1
6 i              0        3           3
7 am             0        6           6
8 good           0        2           2

因此,我有3个数据帧而不是2个数据帧

谢谢!

EN

回答 2

Stack Overflow用户

发布于 2020-09-18 01:13:26

假设每一个都有相同的连接列:

代码语言:javascript
复制
out <- Reduce(function(a,b) merge(a, b, by = "word.", all = TRUE),
              list(df1, df2))
# normally this has `NA` in not-shared words, convert these NAs to 0
out[,-1] <- lapply(out[,-1], function(a) replace(a, is.na(a), 0))
out
#    word. count.x count.y
# 1    am.       0       6
# 2   are.       4       0
# 3  good.       0       2
# 4 hello.       6       6
# 5   how.       8       0
# 6     i.       0       3
# 7  test.       3       3
# 8   you.       1       0

不管你有多少帧,把它们都放在一个list中,这样就行了。(有关“帧列表”效率的讨论,请参阅https://stackoverflow.com/a/24376207/3358272。)

现在您需要做的就是更改列名。(有很多技术可以做到这一点。)

数据

代码语言:javascript
复制
df1 <- structure(list(word. = c("hello.", "test.", "how.", "are.", "you."), count = c(6L, 3L, 8L, 4L, 1L)), class = "data.frame", row.names = c("1", "2", "3", "4", "5"))
df2 <- structure(list(word. = c("hello.", "test.", "i.", "am.", "good."), count = c(6L, 3L, 3L, 6L, 2L)), class = "data.frame", row.names = c("1", "2", "3", "4", "5"))
票数 0
EN

Stack Overflow用户

发布于 2020-09-18 01:16:20

大多数合并的R函数,或者使用更专业的术语,在表之间执行连接操作,被设计为一次在两个表上使用。在base R中,我们有用于这些连接操作的merge函数。由于您有两个以上的表要合并,即使使用此行为,您也可以使用Reduce函数轻松地跨表复制te join。定义如下:

这里是输入数据:

代码语言:javascript
复制
word <- c("hello.", "test.", "how.", "are.", "you.") 

df1 <- data.frame(
  word = word,
  count = 11:15
)

set.seed(1)
df2 <- data.frame(
  word = sample(word, size = 8, replace = T),
  value2 = rnorm(8)
)

set.seed(1)
df3 <- data.frame(
  word = word[c(3,4)],
  value3 = rnorm(2)
)

join的操作如下:

代码语言:javascript
复制
list_dfs <- list(df1, df2, df3)

multi_inner <- Reduce(
  function(x, y, ...) merge(x, y, by = "word", all = TRUE), 
  list_dfs
)

结果如下:

代码语言:javascript
复制
    word count       value2     value3
1   are.    14 -0.294720447  0.1836433
2 hello.    11 -0.928567035         NA
3 hello.    11 -0.005767173         NA
4   how.    13 -0.799009249 -0.6264538
5   how.    13 -0.289461574 -0.6264538
6  test.    12  2.404653389         NA
7  test.    12 -1.147657009         NA
8   you.    15  0.763593461         NA

现在,在这个示例中,我考虑到您希望保存这3个表之间的所有可能组合。如果只想识别所有表中出现的匹配项(或word列中的单词),则需要将all参数设置为FALSE。如下所示:

代码语言:javascript
复制
multi_inner <- Reduce(
  function(x, y, ...) merge(x, y, by = "word", all = FALSE), 
  list_dfs
)

产生以下结果的

代码语言:javascript
复制
  word count     value2     value3
1 are.    14 -0.2947204  0.1836433
2 how.    13 -0.7990092 -0.6264538
3 how.    13 -0.2894616 -0.6264538
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63942811

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档