微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

根据另一列中的唯一值转置一列中的数据

如何解决根据另一列中的唯一值转置一列中的数据

我基本上想做 r 中 here 所描述的

示例数据

// Current mongoess Schema 
const budgetSchema = new mongoose.Schema(
    {
        User: "",Data: [{
            Name: "",Amount: "",Rate: "",Instalment: ""
        }]
    }
);

// Current DataBase Structure on MB cloud 
{"_id":{"$oid":"609b4b48b3c9200618da3289"},"User":"1","Data":[{"_id":{"$oid":"609b4b48b3c9200618da328a"},"A":"Test1","B":"Test2","C":"Test3","D":"Test4"}]
}

//Node Code to push  
const updateArr = await Model.updateOne({
        _id: "609b4b48b3c9200618da3289"
    },{
        '$push': {
            'New': "",'New': "",}
});

// Expected Results
{"_id":{"$oid":"609b4b48b3c9200618da3289"},"Data":
[{"_id":{"$oid":"609b4b48b3c9200618da328a"},"D":"Test4"},{"_id":{"$oid":"newID"},"New":"","New":""}]
}

这是我希望输出的样子 - 作为记录,实际文件会更大(高达 200k),因此我无法事先定义列数

names<-c("k127_60234","k127_60234","k127_50234","k127_50234")
values<-c("ko235","ko123","ko543","ko623","ko443","ko123")
df <- data.frame (names,values)

解决方法

我们可以在一行中使用 dcast

library(data.table)
dcast(setDT(df),names ~ paste0('values',rowid(names)))

-输出

#       names values1 values2 values3 values4
#1: k127_50234   ko443   ko123    <NA>    <NA>
#2: k127_60234   ko235   ko123   ko543   ko623

或者使用 tidyverse

library(dplyr)
library(tidyr)
library(stringr)
df %>%
   mutate(nm1 = str_c('values',rowid(names))) %>%
   pivot_wider(names_from = nm1,values_from = values)

-输出

# A tibble: 2 x 5
#  names      values1 values2 values3 values4
#  <chr>      <chr>   <chr>   <chr>   <chr>  
#1 k127_60234 ko235   ko123   ko543   ko623  
#2 k127_50234 ko443   ko123   <NA>    <NA>   

或者使用 base R

do.call(rbind,lapply(unstack(df[2:1]),`length<-`,4))
,
library(tidyverse)
df %>%
  group_by(names) %>%
  mutate(variable = str_c("values",row_number())) %>%
  pivot_wider(names_from = variable,values_from = values)

 names      values1 values2 values3 values4
  <chr>      <chr>   <chr>   <chr>   <chr>  
1 k127_60234 ko235   ko123   ko543   ko623  
2 k127_50234 ko443   ko123   NA      NA   

在基础 R 中,您可以:

df1 <- transform(df,time = ave(values,names,FUN = seq))
reshape(df1,idvar = "names",dir="wide",sep="")

       names values1 values2 values3 values4
1 k127_60234   ko235   ko123   ko543   ko623
5 k127_50234   ko443   ko123    <NA>    <NA>
           
,

这可能会有所帮助:

df %>% tidyr::spread(values,value = values)

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。