如何使用R基于行值将值从一个数据框分配到另一个数据框?

4nkexdtk  于 2023-04-27  发布在  其他
关注(0)|答案(1)|浏览(100)

我有以下数据集DF 1和DF 2。我希望从DF 2中的Col 3中按顺序分配值到DF 1中的行。请注意,从As和Cs中获得Col 3的唯一值,但所有B都获得一个值,没有具体的,但第一个可用,在本例中,As耗尽值1-9为11。来自第3列的值将按顺序分配给DF 1(升序),只要DF 1中还有需要值的行。(请参见所需输出)。
DF1
| Col1|Col2|
| --------------|--------------|
| 九九|A1|
| 九九|A2|
| 九九|A3|
| 九九|A4|
| 九九|A5|
| 九九|B1|
| 九九|B2|
|98|B3|
|98|B4|
| 九九|C1|
| 九九|C2|
DF2
| Col3|
| --------------|
| 1|
| 三|
| 五|
| 七|
| 九|
| 十一|
| 十三|
| 十五岁|
| 十七岁|
| 十九岁|
| 二十一|
| 二十三|

期望输出

Col1Col2Col3
九九A11
九九A2
九九A3
九九A4
九九A5
九九B1十一
九九B2十一
98B3十三
98B4十三
九九C1十五岁
九九C2十七岁

这是一个非常大的数据集的一部分,我通常在Excel中手动完成。我在R中遇到了一堵墙,真的可以使用帮助。任何输入都将非常感谢。谢谢!

huus2vyu

huus2vyu1#

使用dplyr

library(dplyr)
DF1 %>%
  mutate(
    ltr1 = substr(Col2, 1, 1),
    rn = cumsum(ltr1 != "B" | (lag(ltr1, default=ltr1[1]) != "B" | Col1 != lag(Col1, default=Col1[1]))),
    Col3 = DF2$Col3[rn]
  ) %>%
  select(-ltr1, -rn)
#      Col1 Col2 Col3
# 1      99   A1    1
# 2      99   A2    3
# 3      99   A3    5
# 4      99   A4    7
# 5      99   A5    9
# 6      99   B1   11
# 7      99   B2   11
# 8  **98**   B3   13
# 9  **98**   B4   13
# 10     99   C1   15
# 11     99   C2   17

我之所以从DF2中提取文字行号,是因为我们没有其他的“连接”条件。
演练:

  • cumsum(.)是一个递增器:当条件为真时,则rn递增。对于Col2中不包含"B*"的每一行,这应该按1排序。
  • ltr1 != "B" | lag(..) != "B"确保在"B"行中或前一行是"B"行时,不允许cumsum递增。
  • addedCol1 != lag(Col1)增加了Col1中的更改会导致DF2中使用的行号(rn)递增。
  • (使用rn作为名称完全是任意的,意味着是一个稍后删除的一次性名称)

相关问题