R-合并/组合具有相同名称但某些数据值等于零的列
首先,我有一个特征矩阵和一个来自两个独立文本源的特征的R-合并/组合具有相同名称但某些数据值等于零的列,r,merge,R,Merge,首先,我有一个特征矩阵和一个来自两个独立文本源的特征的data.frame。在每一个方面,我都执行了不同的文本挖掘方法。现在,我想将它们组合起来,但我知道其中一些列的名称相同,如下所示: > dtm.matrix[1:10,66:70] cough nasal sputum yellow intermitt 1 1 0 0 0 0 2 1 0 0 0 0
data.frame
。在每一个方面,我都执行了不同的文本挖掘方法。现在,我想将它们组合起来,但我知道其中一些列的名称相同,如下所示:
> dtm.matrix[1:10,66:70]
cough nasal sputum yellow intermitt
1 1 0 0 0 0
2 1 0 0 0 0
3 0 0 0 0 0
4 0 0 0 0 0
5 0 0 0 0 0
6 1 0 0 0 0
7 0 0 0 0 0
8 0 0 0 0 0
9 0 0 0 0 0
10 0 0 0 0 0
>尺寸(dtm.矩阵)
[1] 14300 6543
第二组是这样的:
> data1.sub[1:10,c(1,37:40)]
Data number cough coughing up blood dehydration dental abscess
1 1 0 0 0 0
2 3 1 0 0 0
3 6 0 0 0 0
4 8 0 0 0 0
5 9 0 0 0 0
6 11 1 0 0 0
7 12 0 0 0 0
8 13 0 0 0 0
9 15 0 0 0 0
10 16 1 0 0 0
> dim(data1.sub)
[1] 14300 168
我从中获得此代码,但我是R的新手,我仍然需要一些帮助:
`data1.sub.merged <- dcast.data.table(merge(
## melt the first data.frame and set the key as ID and variable
setkey(melt(as.data.table(data1.sub), id.vars = "Data number"), "Data number", variable),
## melt the second data.frame
melt(as.data.table(dtm.matrix), id.vars = "Data number"),
## you'll have 2 value columns...
all = TRUE)[, value := ifelse(
## ... combine them into 1 with ifelse
(value.x == 0), value.y, value.x)],
## This is the reshaping formula
"Data number" ~ variable, value.var = "value")`
`data1.sub.merged有很多方法可以做到这一点,例如使用base R、data.table
或dplyr
。选择取决于您的数据量,如果您使用非常大的矩阵(通常是自然语言处理和单词包表示),您可能需要使用不同的方法来解决您的问题,并确定更好(即最快)的解决方案。
我通过dplyr
做了你想做的事。这有点难看,但很管用。我只是合并了两个数据帧,然后对两个数据帧中存在的变量使用for
循环:将它们相加(variable.x和variable.y),然后删除它们。请注意,为了再现性,我稍微更改了列名,但这不会产生任何影响。请让我知道这是否适合你
df1 <- read.table(text =
' cough nasal sputum yellow intermitt
1 1 0 0 0 0
2 1 0 0 0 0
3 0 0 0 0 0
4 0 0 0 0 0
5 0 0 0 0 0
6 1 0 0 0 0
7 0 0 0 0 0
8 0 0 0 0 0
9 0 0 0 0 0
10 0 0 0 0 0')
df2 <- read.table(text =
' Data_number cough coughing_up_blood dehydration dental_abscess
1 1 0 0 0 0
2 3 1 0 0 0
3 6 0 0 0 0
4 8 0 0 0 0
5 9 0 0 0 0
6 11 1 0 0 0
7 12 0 0 0 0
8 13 0 0 0 0
9 15 0 0 0 0
10 16 1 0 0 0')
# Check what variables are common
common <- intersect(names(df1),names(df2))
# Set key IDs for data
df1$ID <- seq(1,nrow(df1))
df2$ID <- seq(1,nrow(df2))
# Merge dataframes
df <- merge(df1, df2,by = "ID")
# Sum and clean common variables left in merged dataframe
library(dplyr)
for (variable in common){
# Create a summed variable
df[[variable]] <- df %>% select(starts_with(paste0(variable,"."))) %>% rowSums()
# Delete columns with .x and .y suffixes
df <- df %>% select(-one_of(c(paste0(variable,".x"), paste0(variable,".y"))))
}
df
ID nasal sputum yellow intermitt Data_number coughing_up_blood dehydration dental_abscess cough
1 1 0 0 0 0 1 0 0 0 1
2 2 0 0 0 0 3 0 0 0 2
3 3 0 0 0 0 6 0 0 0 0
4 4 0 0 0 0 8 0 0 0 0
5 5 0 0 0 0 9 0 0 0 0
6 6 0 0 0 0 11 0 0 0 2
7 7 0 0 0 0 12 0 0 0 0
8 8 0 0 0 0 13 0 0 0 0
9 9 0 0 0 0 15 0 0 0 0
10 10 0 0 0 0 16 0 0 0 1
df1您似乎只是试图将这两个对象合并到一个列上,每个列共享一个称为“数据编号”的列。如果是这样,考虑到您希望保留其余的数据,简单的合并就可以了,关键是要将两个集中重复的所有列都合并在一起(要合并)可以显式引用为键。为了实现这一点,两个集合中所有键中的所有数据必须与另一个集合中的相同列和行一致。您可能也应该首先将它们转换为相同类型的数据结构,如数据框。我将合并所有名称不相同的列的这些对象。对于名称相同的列,我希望将两列合并为一列,同时保留其中两个对象的所有=1值。如果这是清楚的,你能给我看一个代码的例子吗?欢迎来到StackOverflow!作为一个站点策略问题(在r
标签中更是如此),我们要求您提供一个最小的、完整的、可验证的示例(MCVE),而不仅仅是向我们展示数据的外观。请提供可复制的数据,例如通过dput
或使用问题中的内置数据集。请参阅,每一列中是否有一列,即每一列的唯一ID号,而该列不是您将合并它们的“数据”,或者您只是想将两个设置的列并排对齐,并用共享值替换重复的列?