3

オリジナル(以下の更新を参照)

私は R の初心者で、現在、次の表現で 32 列と約 200.000 行のエッジ リストの形でコラボレーション データを扱っています。

1  A    A    A    B    C    A
2  A    B    B    B    C    A
3  A    B    C    C    C    C
4  B    A    B    A    B    C

A、B、Cは出版参加研究機関の国を表す。実際のデータセットの "A" は、たとえば "England" や "China" などの国名です。

一意のレコード (A) とダブル レコード (AA) を保持したいが、トリプレット (AAA) と同じレコードが連続して出現するのを削除したい。コラボレーションは ID によってパブリケーションに割り当てられるため、後で分析できるように順序を同じにする必要があります。ただし、行内の順序は関係ありません。

したがって、最終的にはこのようになります。

1  A   A    B    C    
2  A   B    B    C    A
3  A   B    C    C        
4  B   A    B    A    C

これまでのところ、 123に基づいて、タプル パッケージtriplicatedからいくつかのことを試しました。

df <- data.frame(CTR1 = c("A", "A", "A", "B"), CTR2 = c("A", "B", "B", "A"), CTR3 = c("A", "B", "B", "A"), CTR4 = c("B", "B", "C", "A"), CTR5 = c("C", "C", "C", "B"), CTR6 = c("A", "A", "C", "C"), ID = c(1,2,3,4))

# remember the ID

n <-df$ID

# transpose df (data frame)

dt <- as.data.frame(t(df[, -1]))
colnames(dt) <- n

library(tuple)

dt[!(triplicated(dt) | triplicated(dt, fromLast= TRUE)), ]

# Create new transposed variable

df2 <- as.data.frame(t(df))

ただし、行dt[!(triplicated(dt) | triplicated(dt, fromLast= TRUE)), ]ごとに余剰を示す特定のレコードを削除するだけでなく、次の 4x4 テーブルにつながる行全体を削除します...

   CTR1 CTR3 CTR4 CTR5                   CTR1 CTR2 CTR3 CTR4 CTR5 CTR6
1  A    A    B    C                   1  A    A    B    C        
2  A    B    B    C    rather than    2  A    B    B    C    A   
3  A    B    C    C                   3  A    B    C    C        
4  B    A    A    B                   4  B    A    B    A    C    

ここここdplyrの回答も見ましたが、これまでに適切なアプローチを見つけることができませんでした。

元の問題の説明の実用的な解決策

library(tidyr)
library(dplyr)

countrydf %>% 
  unite(concat,CTR1:CTR6, sep = "") %>% 
  mutate(concat = gsub("([a-zA-Z1-9])\\1{2,}", "\\1\\1-", concat)) %>% 
  separate(concat, paste0("CTR", 1:6), sep = "(?<=.)", remove = TRUE)

Edit1: 明確化のために説明を調整: 実際のデータセットでは、"A" は、たとえば "England" や "China" などの国名です。

Edit2: より正確な再現可能な例を追加します。

アップデート

より正確で再現可能な例を追加し、元の問題の説明に正しい回答を組み込みました (以下を参照)。

countrydf <- data.frame(ID = c(1,2,3,4), 
CTR1 = c("England", "England", "England", "China"),
CTR2 = c("England", "China", "China", "England"),
CTR3 = c("England", "China", "China", "England"),
CTR4 = c("China", "China", "USA", "England"),
CTR5 = c("USA", "USA", "USA", "China"),
CTR6 = c("England", "England", "USA", "USA"))

目指す成果

     CTR1    CTR2    CTR3   CTR4  CTR5  CTR6      ID
1    England England        China USA              1
2    England China   China        USA   England    2
3    England China   China  USA   USA              3
4    China   England England      China USA        4
4

1 に答える 1