R-拆开数据框并创建仅包含2列的新数据框

时间:2020-10-07 17:53:17

标签: r dataframe dplyr

我的目标是实现以下目标,并且在这里很难找到其他谈论同一件事的帖子。 我的基本代码如下:

df = data.frame(cusip=c("A","B","C","D","A","C","Z","A","B"),
                port=c("p1","p1","p1","p1","p2","p2","p2","p3","p3"))

...执行某些操作,并获得以下数据框: 行=列“端口”中的唯一值 column =仅一列显示(带有字符串)与第一列中指定的投资组合相关的所有唯一的cusip值。 因此,结果应如下所示:

df2 = data.frame(port=c("p1","p2","p3"),
                cusip=c("A, B C, D",    "A, C, Z",   "A, B"))

我试图做类似的事情:

u = unstack(df1)

但是,这给了我一个列表,该列表的每个名称都对应一个唯一的投资组合ID,并且列表的每个元素都包含一个长度不确定的向量,且所有cusip值都与该投资组合相关联。 所以在这一点上我有点迷路了。 我阅读了此解决方案Converting a list of lists of strings to a data frame of numbers in R,该解决方案说明了如何将列表转换回数据框,但是由于与任何给定的投资组合相关的客户数量未知,因此对我没有太大帮助。 有什么建议?谢谢

3 个答案:

答案 0 :(得分:3)

可以使用base R来完成aggregate()的解决方案:

#Code
aggregate(cusip~port,df,function(x) paste0(x,collapse = ', '))

输出:

  port      cusip
1   p1 A, B, C, D
2   p2    A, C, Z
3   p3       A, B

答案 1 :(得分:1)

具有def test_successfully_update_inventory(self): data = {'product1': 500, 'product2': 200} response = self.client.post(reverse('inventory:update-inventory'), data, format='json') stream_handler = logging.StreamHandler(sys.stdout) logger.addHandler(stream_handler) logging.getLogger().info(response) # Prints The email can't be sent int main() inFile.get(file); while(inFile) { inFile.get(file); cout << file; if(inFile.fail()) { break; } if(inFile) { ++charNum; } if(inFile && c =='<') { ++comNum; } 的解决方案是

dplyr

给出

stringr

答案 2 :(得分:1)

我们也可以使用toString

aggregate(cusip ~ port, df, toString)

或与data.table

library(data.table)
setDT(df)[, .(cusip = toString(cusip)), port]