R 如果满足条件,如何从另一个数据帧列中减去数据帧列?

R 如果满足条件,如何从另一个数据帧列中减去数据帧列?,r,dataframe,conditional-statements,multiple-columns,subtraction,R,Dataframe,Conditional Statements,Multiple Columns,Subtraction,我有两个简单的数据框,其中包含“word”和“n”列,表示某个单词出现的频率。以下是一个例子: df1 <- data.frame(word=c("beautiful","nice","like","good"),n=c(400,378,29,10)) df2 <- data.frame(word=c("beautiful","nice","like","good","wonderful","awesome","sad","happy"),n=c(6000,20,5,150,300,

我有两个简单的数据框,其中包含“word”和“n”列,表示某个单词出现的频率。以下是一个例子:

df1 <- data.frame(word=c("beautiful","nice","like","good"),n=c(400,378,29,10))
df2 <- data.frame(word=c("beautiful","nice","like","good","wonderful","awesome","sad","happy"),n=c(6000,20,5,150,300,26,17,195))
但是,我正在努力使用减法命令,因为条件是df1中的单词也必须在
df2
中,然后只减法
df2$n-df1$n

谢谢你的帮助

require(dplyr)
 df1 %>% 
  inner_join(df2, by = 'word') %>% 
  mutate(diff = n.y - n.x) %>% 
  select(word, diff)
给予

给予


使用
合并

> df.tmp <- merge(df1, df2, by="word", all=TRUE)
> df.tmp$result <- df.tmp$n.y - df.tmp$n.x
> df.tmp
       word n.x  n.y result
1 beautiful 400 6000   5600
2      good  10  150    140
3      like  29    5    -24
4      nice 378   20   -358
5   awesome  NA   26     NA
6     happy  NA  195     NA
7       sad  NA   17     NA
8 wonderful  NA  300     NA
>df.tmp df.tmp$结果df.tmp
单词n.x n.y结果
1漂亮的400 6000 5600
2良好10150 140
3如29 5-24
4尼斯378 20-358
5不适用26不适用
6快乐NA 195 NA
7悲伤的NA 17悲伤的NA
8美妙的NA 300 NA
如果你只想要匹配的单词

> df.tmp <- merge(df1, df2, by="word")
> df.tmp$result <- df.tmp$n.y - df.tmp$n.x
> df.tmp
       word n.x  n.y result
1 beautiful 400 6000   5600
2      good  10  150    140
3      like  29    5    -24
4      nice 378   20   -358
>df.tmp df.tmp$结果df.tmp
单词n.x n.y结果
1漂亮的400 6000 5600
2良好10150 140
3如29 5-24
4尼斯378 20-358

使用
合并

> df.tmp <- merge(df1, df2, by="word", all=TRUE)
> df.tmp$result <- df.tmp$n.y - df.tmp$n.x
> df.tmp
       word n.x  n.y result
1 beautiful 400 6000   5600
2      good  10  150    140
3      like  29    5    -24
4      nice 378   20   -358
5   awesome  NA   26     NA
6     happy  NA  195     NA
7       sad  NA   17     NA
8 wonderful  NA  300     NA
>df.tmp df.tmp$结果df.tmp
单词n.x n.y结果
1漂亮的400 6000 5600
2良好10150 140
3如29 5-24
4尼斯378 20-358
5不适用26不适用
6快乐NA 195 NA
7悲伤的NA 17悲伤的NA
8美妙的NA 300 NA
如果你只想要匹配的单词

> df.tmp <- merge(df1, df2, by="word")
> df.tmp$result <- df.tmp$n.y - df.tmp$n.x
> df.tmp
       word n.x  n.y result
1 beautiful 400 6000   5600
2      good  10  150    140
3      like  29    5    -24
4      nice 378   20   -358
>df.tmp df.tmp$结果df.tmp
单词n.x n.y结果
1漂亮的400 6000 5600
2良好10150 140
3如29 5-24
4尼斯378 20-358

这里是一个使用for循环和%
运算符中的
%的快速解决方案

df2$diff <- NA
for (i in 1:nrow(df2)) {
  if (df2$word[i] %in%  df1$word[i]) {
    df2$diff[i] <- df2$n[i] - df1$n[i]
  }
}
df2

下面是一个使用for循环和%
运算符中的
%的快速解决方案

df2$diff <- NA
for (i in 1:nrow(df2)) {
  if (df2$word[i] %in%  df1$word[i]) {
    df2$diff[i] <- df2$n[i] - df1$n[i]
  }
}
df2

这是一个矢量化的基本解决方案,其中布尔乘法用于替换@Rob的for lop中使用的if-then构造:

 df2$n.adjusted <- df2$n - (df2$word %in% df1$word)* # zero if no match
                                 df1$n[ match(df1$word, df2$word) ] # gets order correct
> df2
       word    n n.adjusted
1 beautiful 6000       5600
2      nice   20       -358
3      like    5        -24
4      good  150        140
5 wonderful  300        300
6   awesome   26         26
7       sad   17         17
8     happy  195        195
df2$n.调整后的df2
单词
1漂亮的6000 5600
2尼斯20-358
3如5-24
4良好150 140
5精彩300 300
6可怕的26 26
7悲伤17 17
8快乐195 195
下面是我用来测试的示例,其中df1单词的顺序与df2中的顺序不同,长度也不是偶数倍:

> df1 <-data.frame(word=c("nice","beautiful","like","good"),n=c(378,400,29,10))
> df2 <- data.frame(word=c("beautiful","nice","like","good","wonderful","awesome","sad"),n=c(6000,20,5,150,300,26,17))
> 
>  df1
       word   n
1      nice 378
2 beautiful 400
3      like  29
4      good  10
>  df2
       word    n
1 beautiful 6000
2      nice   20
3      like    5
4      good  150
5 wonderful  300
6   awesome   26
7       sad   17
> df2$n.adjusted <- df2$n - (df2$word %in% df1$word)*df1$n[match(df1$word, df2$word)]
Warning message:
In (df2$word %in% df1$word) * df1$n[match(df1$word, df2$word)] :
  longer object length is not a multiple of shorter object length
> df2
       word    n n.adjusted
1 beautiful 6000       5600
2      nice   20       -358
3      like    5        -24
4      good  150        140
5 wonderful  300        300
6   awesome   26         26
7       sad   17         17
>df1 df2
>df1
单词n
1尼斯378
2美丽的400
3像29
4好10
>df2
单词n
1漂亮的6000
2尼斯20
3像5
4良好150
5精彩300
6可怕的26
7悲伤的17
>df2$n.调整后的df2
单词
1漂亮的6000 5600
2尼斯20-358
3如5-24
4良好150 140
5精彩300 300
6可怕的26 26
7悲伤17 17

这是一个矢量化的基本解决方案,其中布尔乘法用于替换@Rob中for lop中使用的if-then构造:

 df2$n.adjusted <- df2$n - (df2$word %in% df1$word)* # zero if no match
                                 df1$n[ match(df1$word, df2$word) ] # gets order correct
> df2
       word    n n.adjusted
1 beautiful 6000       5600
2      nice   20       -358
3      like    5        -24
4      good  150        140
5 wonderful  300        300
6   awesome   26         26
7       sad   17         17
8     happy  195        195
df2$n.调整后的df2
单词
1漂亮的6000 5600
2尼斯20-358
3如5-24
4良好150 140
5精彩300 300
6可怕的26 26
7悲伤17 17
8快乐195 195
下面是我用来测试的示例,其中df1单词的顺序与df2中的顺序不同,长度也不是偶数倍:

> df1 <-data.frame(word=c("nice","beautiful","like","good"),n=c(378,400,29,10))
> df2 <- data.frame(word=c("beautiful","nice","like","good","wonderful","awesome","sad"),n=c(6000,20,5,150,300,26,17))
> 
>  df1
       word   n
1      nice 378
2 beautiful 400
3      like  29
4      good  10
>  df2
       word    n
1 beautiful 6000
2      nice   20
3      like    5
4      good  150
5 wonderful  300
6   awesome   26
7       sad   17
> df2$n.adjusted <- df2$n - (df2$word %in% df1$word)*df1$n[match(df1$word, df2$word)]
Warning message:
In (df2$word %in% df1$word) * df1$n[match(df1$word, df2$word)] :
  longer object length is not a multiple of shorter object length
> df2
       word    n n.adjusted
1 beautiful 6000       5600
2      nice   20       -358
3      like    5        -24
4      good  150        140
5 wonderful  300        300
6   awesome   26         26
7       sad   17         17
>df1 df2
>df1
单词n
1尼斯378
2美丽的400
3像29
4好10
>df2
单词n
1漂亮的6000
2尼斯20
3像5
4良好150
5精彩300
6可怕的26
7悲伤的17
>df2$n.调整后的df2
单词
1漂亮的6000 5600
2尼斯20-358
3如5-24
4良好150 140
5精彩300 300
6可怕的26 26
7悲伤17 17

您的示例与您的问题不匹配。
df1
中没有包含在
df2
中的单词是的,我认识到很抱歉,现在我更改了它。您的示例与您的问题不匹配。
df1
中没有包含在
df2
中的单词是的,我认识到了,很抱歉,现在我更改了它,非常感谢!工作得很好是否也有可能接收到所有单词的数据帧而不是仅匹配的单词?@Lucinho91是的,将
internal\u join
更改为
left\u join
谢谢,但这对我不起作用:/它仍然只给我匹配的单词,而不是allOh,我以为你指的是df1中的所有单词。要显示df2中的所有单词,请使用
右键连接
。或者对于
df1
df2
中的所有单词,请使用
full\u-join
非常感谢!工作得很好是否也有可能接收到所有单词的数据帧而不是仅匹配的单词?@Lucinho91是的,将
internal\u join
更改为
left\u join
谢谢,但这对我不起作用:/它仍然只给我匹配的单词,而不是allOh,我以为你指的是df1中的所有单词。要显示df2中的所有单词,请使用
右键连接
。或者对于
df1
df2
中的所有单词,使用
full\u join
我对这个解决方案不太满意。当不匹配的单词数不等于匹配的单词数时,它会抛出一个警告(尽管仍然是正确的结果)。我对这个解决方案不太满意。当不匹配的字数不等于匹配的字数时,它会抛出警告(尽管结果仍然正确)。