亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何獲取唯一 ID 并將另一列的每一行轉換為 R 和 Python 中的另一列

如何獲取唯一 ID 并將另一列的每一行轉換為 R 和 Python 中的另一列

藍山帝景 2022-12-14 20:37:50
我的數據具有以下形式:groups <- c("4","4.2","4.2.1","4.2.1.1", "1", "1.2", "1.2.1", "1.2.1.2","1.2.1.2.1")x <- data.frame(ID = c(rep("samp_1", 4), rep("samp_2", 5)), Group = groups)我如何得到這個?:ID       col_1   col_2   col_3   col_4     col_5samp_1   4       4.2     4.2.1   4.2.1.1   NAsamp_2   1       1.2     1.2.1   1.2.1.2   1.2.1.2.1每列將由字符串的長度決定,因此第 4 列中的所有數據的長度均為 4(或包括點在內的長度為 7)。我正在尋找最通用的解決方案(例如使用循環;使用盡可能少的包)因為我需要在 R 和 Python 中實現它。
查看完整描述

3 回答

?
HUH函數

TA貢獻1836條經驗 獲得超4個贊

在中,我們可以使用(from )R為新名稱創建一個列,并將其轉換為“寬”格式rowiddata.table


library(dplyr)

library(data.table)

library(stringr)

x %>%

   mutate(name = str_c('col_', rowid(ID))) %>% 

   pivot_wider(names_from = name, values_from = Group)

# A tibble: 2 x 6

#  ID     col_1 col_2 col_3 col_4   col_5    

#  <chr>  <chr> <chr> <chr> <chr>   <chr>    

#1 samp_1 4     4.2   4.2.1 4.2.1.1 <NA>     

#2 samp_2 1     1.2   1.2.1 1.2.1.2 1.2.1.2.1

或使用data.table


library(data.table)

dcast(setDT(x), ID ~ paste0('col_', rowid(ID)), value.var = 'Group')

#       ID col_1 col_2 col_3   col_4     col_5

#1: samp_1     4   4.2 4.2.1 4.2.1.1      <NA>

#2: samp_2     1   1.2 1.2.1 1.2.1.2 1.2.1.2.1

或base R與reshape


reshape(transform(x, name = paste0('col_', ave(seq_along(ID), ID, 

    FUN = seq_along))), idvar = 'ID', direction = 'wide', timevar = 'name')


查看完整回答
反對 回復 2022-12-14
?
aluckdog

TA貢獻1847條經驗 獲得超7個贊

akrun 的優秀選擇。如果數據有點亂,你可能想試試這個:


x %>%

  mutate(temp = str_c('col_', str_count(Group, "\\."))) %>%

  pivot_wider(names_from = temp, values_from = Group) %>%

  select(ID, order(colnames(.)))

數據:


groups <- c("41.2","4","4.2.1","4.2.1.1", "1", "1.2", "1.2.1", "1.2.1.2","1.2.1.2.1")

x <- data.frame(ID = c(rep("samp_1", 4), rep("samp_2", 5)), Group = groups)

結果:


# A tibble: 2 x 6

  ID     col_0 col_1 col_2 col_3   col_4    

  <chr>  <chr> <chr> <chr> <chr>   <chr>    

1 samp_1 4     41.2  4.2.1 4.2.1.1 NA       

2 samp_2 1     1.2   1.2.1 1.2.1.2 1.2.1.2.1


查看完整回答
反對 回復 2022-12-14
?
慕虎7371278

TA貢獻1802條經驗 獲得超4個贊

你可以在 python 中試試這個:


import pandas as pd

import numpy as np

df= pd.DataFrame({'ID':np.repeat(["samp_1","samp_2"],[4,5]),

                 'groups':["4","4.2","4.2.1","4.2.1.1", "1", "1.2", "1.2.1", "1.2.1.2","1.2.1.2.1"],})

df['entry']=df.groupby(['ID']).cumcount()+1

我們為每組提供一個數字,并將其添加為entry列。下面我們像在 R 中一樣進行旋轉,使用該列提供列名,最后我們重置索引:


df.pivot(values='groups',columns='entry',index='ID').reset_index()


entry   ID  1   2   3   4   5

0   samp_1  4   4.2 4.2.1   4.2.1.1 NaN

1   samp_2  1   1.2 1.2.1   1.2.1.2 1.2.1.2.1


查看完整回答
反對 回復 2022-12-14
  • 3 回答
  • 0 關注
  • 122 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號