オリジナル(以下の更新を参照)
私は 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
これまでのところ、 1、2、3に基づいて、タプル パッケージ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