首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用多个选项在dataframe中创建新列

使用多个选项在dataframe中创建新列
EN

Stack Overflow用户
提问于 2022-11-25 15:08:26
回答 2查看 56关注 0票数 1

数据作为列表:

代码语言:javascript
复制
dfcheck <- data.frame(status = c("open/close", "close", "open"), stock = c("company energy","goods and books","other"), name = c("amazon1;google1","google3;yahoo1","yahoo2;amazon2;google2"))

和这样的输入数据:

代码语言:javascript
复制
dfdata <- data.frame(id = c("id1", "id2", "id3"), title1 = c("amazon1","google1","yahoo1"), title2 = c("yahoo2",NA,"amazon2"))

如何能够根据前面的列表生成包含列的数据文件:

预期产出: dfdata <- data.frame(id = c("id1“、"id2”、"id3")、title1 = c("amazon1“、"google1”、"yahoo1")、title2 = c("yahoo2“、NA、"amazon2")、status1 =c(”开放/关闭“、”开放/关闭“、”关闭“)、stock1 =c(”公司能源“、”公司能源“、”商品和书籍“)、status2 =c(”开放“、NA、”开放“),stock2 =c(“其他”、NA、“其他”)

id title1 title2 status1 stock1 status2 1 id1 amazon1 yahoo2打开/关闭公司能源开放2 id2 google1打开/关闭公司能源3 id3 yahoo1 amazon2关闭商品和书籍打开stock2 1其他2 3

此dataframe检查每个列中的dfdata,如果dfcheck dataframe中存在任何值,则期望第一个id列,并创建两个具有dfcheck状态和库存的新列。在dfcheck中,列名有多个由“;;”分隔的值。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2022-11-25 15:39:48

图书馆:

代码语言:javascript
复制
library(dplyr)
library(stringr)
library(tidyr)

首先,您需要整理您的dfcheck data.frame:

代码语言:javascript
复制
dfcheck_tidy <- dfcheck %>%
  mutate(name = str_split(name, ";")) %>%
  unnest(name)

(我不使用tidyr::separate来做这件事,从您的示例中可以看出,您可以有一个由“;”分隔的可变长度的名称。)

现在您可以执行这两个联接:

代码语言:javascript
复制
dfdata %>%
  left_join(dfcheck_tidy,
            by = c("title1" = "name")) %>%
  left_join(dfcheck_tidy,
            by = c("title2" = "name"),
            suffix = c("1", "2"))
#    id  title1  title2    status1          stock1 status2 stock2
# 1 id1 amazon1  yahoo2 open/close  company energy    open  other
# 2 id2 google1    <NA> open/close  company energy    <NA>   <NA>
# 3 id3  yahoo1 amazon2      close goods and books    open  other
票数 2
EN

Stack Overflow用户

发布于 2022-11-25 15:53:09

下面是从regex_join()包中使用fuzzyjoin的一种方法。

代码语言:javascript
复制
library(dplyr)
library(fuzzyjoin)
regex_right_join(dfcheck, dfdata, by = c(name = "title1")) %>% 
  regex_right_join(dfcheck, ., by = c(name = "title2")) %>% 
  select(!contains("name")) %>% 
  relocate(id, title1, title2) 
代码语言:javascript
复制
   id  title1  title2 status.x stock.x   status.y         stock.y
1 id1 amazon1  yahoo2     open   other open/close  company energy
2 id2 google1    <NA>     <NA>    <NA> open/close  company energy
3 id3  yahoo1 amazon2     open   other      close goods and books
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/74574699

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档