【问题标题】:Keep top 10% of observations across multiple dataframes without losing data in R在多个数据帧中保持前 10% 的观察结果,而不会丢失 R 中的数据
【发布时间】:2015-09-12 16:02:10
【问题描述】:

我在 rbind.fill'ing 多个数据帧同时对它们进行子集化时遇到问题。我的一般数据框是 1x(6000->60,000),其中单行是给定的纪念馆(林肯纪念堂),列是 Yelp 和 Trip Advisor 上每条评论中的每个单词对,数字是多少出现单词对的次数。

我想将其减少到词对的前 10%,同时又不会失去其中一个中的后 90% 是另一个词对中前 10% 的机会。

four_score = c(60)
seven_years = c(100)
dataframe1 <- data.frame(four_score,seven_years)


seven_years = c(10)
our_fathers = c(40)
dataframe2 <- data.frame(seven_years,our_fathers)

four_score = c(100, 10)
our_fathers = c(NA, 40)
goal = (data.frame(four_score,our_fathers))
goal$dfName <- c("Dataframe1", "DataFrame2")

这就是目标,我从每个 DF(four_score=100,our_fathers=40)中提取了最常用的词对(前 10%),但也能够填写four_score=10(这是后 90%)在 DF2 中,但因为它在 DF1 中是前 10%,所以它填充)。

到目前为止,我极其混乱的代码如下:

library(reshape2)
library(dplyr)
library(data.table)
four_score = c(60)
seven_years = c(100)
dataframe1 <- data.frame(four_score,seven_years)
dataframe1 <- data.frame(t(dataframe1))
dataframe1$Words <- row.names(dataframe1)
colnames(dataframe1)[1] <- "Count"
dataframe1 = dataframe1[order(-dataframe1$Count),]
row.names(dataframe1)<- NULL
dfName = "dataframe1"
dataframe1  <-cbind(dataframe1,dfName)
melted_df1 <- melt(dataframe1, id=c("dfName", "Words"), measure="Count", variable.name="test")

seven_years = c(10)
our_fathers = c(40)
dataframe2 <- data.frame(seven_years,our_fathers)
dataframe2 <- data.frame(t(dataframe2))
dataframe2$Words <- row.names(dataframe2)
colnames(dataframe2)[1] <- "Count"
dataframe2 = dataframe2[order(-dataframe2$Count),]
row.names(dataframe2)<- NULL
dfName = "dataframe2"
dataframe2  <-cbind(dataframe2,dfName)
melted_df2 <- melt(dataframe2, id=c("dfName", "Words"), measure="Count", variable.name="test")

merged_melt <- rbind.fill(melted_df1, melted_df2)
merged_melt <- data.table(merged_melt)

so_close <- merged_melt[order(value, decreasing = TRUE), head(.SD, n = ceiling(.N/10)), by = dfName] %>%
  dcast.data.table(dfName ~ value)

但是,这并没有解决真正的问题 - 在第二个数据帧中发现 J=10 并将其填充。事后我需要 %in% 的东西吗?

【问题讨论】:

  • 对不起,我根本没有得到这个。您的 dataframe1dataframe2 各有 1 行和 2 列。 goal 有 2 行 2 列。前10%是什么?这是怎么定义的?
  • 是的,我不知道你想要完成什么。
  • 抱歉,我会再编辑一下。试着让它更清楚......这只是一个例子。基本上,我有许多单个纪念馆(一行)的数据框,在所有关于给定纪念馆的在线评论中每两个词组合(参见编辑,“four_score”),# 是这两个词组合的次数出现在所有评论中。

标签: r subset dplyr rbind


【解决方案1】:

您需要一个流程来挑选前 x% 的行并提取相应的字母。然后返回数据集并找到包含这些字母的行。这样,您将在一个数据集中显示属于 x% 而在其他数据集中不属于的字母的所有信息。

在你创建 2 个融合数据集的那一刻试试这个:

# combine all your melted datasets
df_full = rbind(melted_df1, melted_df2)


df_full %>%
  group_by(dfName) %>%                               # for each dataset
  do(.[order(-.$value),][round(nrow(.)*0.5),]) %>%   # get the top 50% after ordering by value
  ungroup() %>%
  select(Letters) %>%                                # keep the letters you found
  distinct() %>%                                     # keep distinct letters (avoid using a letter multiple times)
  inner_join(df_full, by="Letters") %>%              # join back info from initial table
  dcast(dfName~Letters)                              # reshape


    #       dfName  d   j
    # 1 dataframe1 NA 100
    # 2 dataframe2 40  10

【讨论】:

  • 天哪。非常感谢!这就说得通了。当我发布此内容时,我发现了一个与 %in% 相关的问题,但我无法概念化如何去做。但是,是的,我确实有更多的数据集(~40)。我需要把它变成一个函数并 lapply 吗?
  • 您需要能够制作每个数据集的融合版本,然后将它们重新绑定到一个大数据集中。然后我会给你一个代码来处理剩下的事情。我会更新我的答案。首先检查这个简单的例子,看看它是如何工作的。
  • 我稍微改变了第二个调用,它工作得很好!谢谢你的帮助。完整 % dplyr::group_by(MonumentName) %>% dplyr::do(.[order(.$value),]) %>% dplyr::do(utils::head(., "value ", n = floor(nrow(.)/10)))%>% ungroup() %>% select(Bigram) %>% distinct() %>% inner_join(Full_List_Melted, by="Bigram") %>% dcast(MonumentName~Bigram, value.var="value")
猜你喜欢
  • 1970-01-01
  • 2018-08-17
  • 1970-01-01
  • 2016-10-04
  • 1970-01-01
  • 1970-01-01
  • 2017-05-17
  • 2020-09-27
  • 2020-06-21
相关资源
最近更新 更多