感谢@jazzurro的帮助。这使我意识到重复项可能会使事情复杂化。我希望仅保留唯一的值/行可以简化任务。*
df <- data.frame(ID = c(1,2,3,4,5),
CTR1 = c("England", "England", "England", "China", "Sweden"),
CTR2 = c("England", "China", "China", "England", NA),
CTR3 = c("USA", "USA", "USA", "USA", NA),
CTR4 = c(NA, NA, NA, NA, NA),
CTR5 = c(NA, NA, NA, NA, NA),
CTR6 = c(NA, NA, NA, NA, NA))
ID CTR1 CTR2 CTR3 CTR4 CTR5 CTR6
1 England China USA
2 England China USA
3 England China USA
4 China England USA
5 Sweden
仍然是基于以下四个条件创建共现矩阵(现在)的目标:
不考虑ID /行中没有其他观察值的单个观察值,即仅将一个国家/地区的行一次计为0。
组合/同现应计为1。
处于组合状态也将被视为自组合(美国-美国),即,将值分配为1。
没有按行/ ID分配给组合的值超过1。
理想结果
China England USA Sweden
China 4 4 4 0
England 4 4 4 0
USA 4 4 4 0
Sweden 0 0 0 0
*我已使用here中的代码删除了所有非唯一的观察结果。
假设我的数据集的列数少两位(某些NA /空),并且行数超过100.000,由以下示例数据帧表示
df <- data.frame(ID = c(1,2,3,4,5),
CTR1 = c("England", "England", "England", "China", "England"),
CTR2 = c("England", "China", "China", "England", NA),
CTR3 = c("England", "China", "China", "England", NA),
CTR4 = c("China", "USA", "USA", "China", NA),
CTR5 = c("USA", "England", "USA", "USA", NA),
CTR6 = c("England", "China", "USA", "England", NA))
df
ID CTR1 CTR2 CTR3 CTR4 CTR5 CTR6
1 England England England China USA England
2 England China China USA England China
3 England China China USA USA USA
4 China England England China USA England
5 England
并且我想对ID /行的同现进行计数,以获得一个共现矩阵,该矩阵仅对ID /行的同现进行总和一次,这意味着不会将超过1的值分配给组合(即为不存在行内频率和顺序的同现指定一个值1,为不共现/ ID /行组合不指定为0。
1 England-England-England => 1
2 England-England => 1
3 England-China => 1
4 England- => 0
[另一个重要方面是关于连续出现一次但与其他观察值相结合的观察值的计数,例如美国在第1行中。他们应该为自己的同现获得1的值(因为即使不是与他们自己在一起,它们也处于结合状态),以便USA-USA的结合也得到1的赋值。
1 England England England China USA England
USA-USA => 1 China-China => 1 USA-China => 1 England-England => 1 England-USA => 1 England-China => 1
由于行/ ID的组合,行数不应大于1,因此得出:
China England USA China 1 1 1 England 1 1 1 USA 1 1 1
这应基于示例数据帧得出以下结果,其中基于每个组合至少出现在四行中并且每个字符串是原始组合的一部分的事实为每个组合分配值4数据框:
China England USA China 4 4 4 England 4 4 4 USA 4 4 4
所以有五个条件可以计数:
我已经尝试通过使用dplyr
,data.table
,base aggregate
,plyr
,[1]和[]中的[2],[3],[4]或[5]调整代码来实现此目的C0],但由于我不在乎连续的顺序,但我也不想汇总连续的所有组合,因此到目前为止,我还没有得到理想的结果。
我是R的新手。非常感谢您的帮助。
更新感谢@jazzurro的回答。这使我意识到重复项可能会使事情复杂化。我希望仅保留唯一的值/行可以简化任务。* df
DATA
这里是使用# Transform the data to long-format data. Remove rows that have zero character (i.e, "") or NA.
melt(setDT(df), id.vars = "ID", measure = patterns("^CTR"))[nchar(value) > 0 & complete.cases(value)] -> foo
# Get distinct value (country) in each ID group (each row)
unique(foo, by = c("ID", "value")) -> foo2
# https://stackoverflow.com/questions/13281303/creating-co-occurrence-matrix
# Seeing this question, you want to create a matrix with crossprod().
crossprod(table(foo2[, c(1,3)])) -> mymat
# Finally, you need to change diagonal values. If a value is equal to one,
# change it to zero. Otherwise, keep the original value.
diag(mymat) <- ifelse(diag(mymat) <= 1, 0, mymat)
#value
#value China England Sweden USA
#China 4 4 0 4
#England 4 4 0 4
#Sweden 0 0 0 0
#USA 4 4 0 4
的选项: