R 如果满足条件,如何从另一个数据帧列中减去数据帧列?
我有两个简单的数据框,其中包含“word”和“n”列,表示某个单词出现的频率。以下是一个例子: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,
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
我对这个解决方案不太满意。当不匹配的单词数不等于匹配的单词数时,它会抛出一个警告(尽管仍然是正确的结果)。我对这个解决方案不太满意。当不匹配的字数不等于匹配的字数时,它会抛出警告(尽管结果仍然正确)。