数据和代码
假设我的数据集的列数少两位(某些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的帮助。这使我意识到重复项可能使事情复杂化。我希望仅按行保留唯一值可以简化任务,以便通过应用[6]中的代码来使示例数据框看起来像这样。
here仅满足三个条件:
不考虑按ID /行没有附加观察值的单个观察值,即不计算一次仅具有一个国家的行。
组合应计为1。
处于组合状态也将被视为自组合(美国-美国),即,将值分配为1。
原始(请参阅下面的更新),假设我的数据集的列数较低(一些NA /空),并且行数超过100.000,由以下示例数据帧df表示
数据和代码
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("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 England
如果您想考虑每一行并查找唯一国家的所有可能组合,并计算每对出现在数据集中的次数,则可以执行以下操作。我仍然认为,鉴于我们在评论中所传达的内容,USA-USA组合在数据集中不会出现四次。由于时间限制,我无法继续前进。如果您需要进一步的帮助,我明天尝试找时间。
# ID CTR1 CTR2 CTR3 CTR4 CTR5 CTR6 #1: 1 England England England China USA England #2: 2 England China China USA England China #3: 3 England China China USA USA USA #4: 4 China England England China USA England #5: 5 Sweden <NA> <NA> <NA> <NA> # Transform the data to long-format data. Remove rows that have # zero character (i.e, "") or NA. For each group defined by ID, # remove the only row if the total number of the rows is 1 for the group. melt(setDT(df), id.vars = "ID", measure = patterns("^CTR"))[ nchar(value) > 0 & complete.cases(value)][,.SD[.N > 1], by = ID] -> foo # Get unique country names for each ID group. Finally, count how many rows each country # appear. unique(foo, by = c("ID", "value"))[, .(total_rows = .N), by = value] # value total_rows #1: England 4 #2: China 4 #3: USA 4
数据和代码