在多个数据帧中保留前 10% 的观察结果,而不会丢失 R 中的数据

Keep top 10% of observations across multiple dataframes without losing data in R

我在对多个数据帧进行子集化处理时遇到了问题 rbind.fill。我的一般数据框是 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 中(在 DF2 中为底部 90%,但由于它在 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% 的东西吗?

您需要一个进程来选择前 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