使用Stata,假设我有这些数据:
clear all
set more off
input ///
id str5 value
1 fox
1 ox
1 cow
2 fox
2 fox
3 ox
3 fox
3 cow
4 cow
4 ox
end
与previous answer中一样,如果想要在组内确定值是否相同,可以使用:
bysort id (value) : gen onevalue = value[1] == value[_N]
我的问题与此有关,但它更进了一步。我想知道value
所采用的id
组合的频率。我不想考虑id
中的频率或顺序 - 我只关心是否至少出现过一次。这可能有点令人困惑,所以为了说明,我想知道如下内容:
数据中有三个不同的组:A)fox, ox, cow
,B)fox
和C)cow, ox
。请注意,ids 1
和3
都属于群组A
,ID 2
属于群组B
,而身份4
属于群组{ {1}}。
C
我不需要这种格式,但知道这些信息对我很有帮助。有没有一种简单的方法来完成这项任务?我想到的最好的方法是创建一堆新变量,这些变量是Combination Freq
fox, ox, cow 2
fox 1
cow, ox 1
中某个元素是否在value
中的指标,然后是id
这些变量的所有组合。但我觉得应该有更好的方法。
我还希望能够根据上述结果删除某些tab
。
答案 0 :(得分:3)
以下是两个选项。
第一个:
clear
set more off
input ///
id str5 value
1 fox
1 ox
1 cow
2 fox
2 fox
3 ox
3 fox
3 cow
4 cow
4 ox
5 cow
5 fox
5 fox
end
list, sepby(id)
*-----
// drop duplicates within -id-s
bysort id value : keep if _n == 1
// reshape
bysort id: gen j = _n
reshape wide value, i(id) j(j)
// concatenate
egen conc = concat(value*), punct(" ") // optional; -contract- takes varlist
contract conc
list
第二个:
clear
set more off
input ///
id str5 value
1 fox
1 ox
1 cow
2 fox
2 fox
3 ox
3 fox
3 cow
4 cow
4 ox
5 cow
5 fox
5 fox
end
list, sepby(id)
*-----
// drop duplicates within -id-s
bysort id value : keep if _n == 1
// reshape
bysort id : gen j = _n
reshape wide value, i(id) j(j)
// concatenate
egen cvalue0 = concat(value*), punct(" ")
drop value?
// reshape
reshape long cvalue, i(id) j(j)
// frequencies
bysort cvalue : gen freq = _N
// list
order cvalue
sort cvalue id
drop j
list
使用第二个选项,如果需要,您可以merge
将结果信息与原始数据集一起返回。
潜在地,许多变量都是使用reshape wide
创建的,这可能是一个问题,具体取决于您的实际数据集的大小以及Stata的风格。
答案 1 :(得分:3)
这是另一个:
duplicates drop id value, force
levelsof value, local(animals) clean
gen has_ = 1
reshape wide has_*, i(id) j(value, string)
collapse (count) N=id, by(has_*)
rename has_* *
foreach beast of local animals {
sdecode `beast', replace
replace `beast' = cond(`beast'=="1","`beast'","")
}
egen group = concat(`animals'), punct(" ")
replace group = stritrim(group)
drop `animals'
答案 2 :(得分:2)
这是@Roberto Ferrer的有用答案的变体。我们在适当的地方连接,所以避免任何reshape
。假设我们正在查看字符串变量。如果没有,请先应用tostring
或string()
。
. clear
. input id str5 value
id value
1. 1 fox
2. 1 ox
3. 1 cow
4. 2 fox
5. 2 fox
6. 3 ox
7. 3 fox
8. 3 cow
9. 4 cow
10. 4 ox
11. 5 cow
12. 5 fox
13. 5 fox
14. end
. bysort id (value) : gen all = value if _n == 1
(8 missing values generated)
. by id : replace all = cond(value != value[_n-1], all[_n-1] + " " + value, all[_n-1]) if _n > 1
(8 real changes made)
. by id : replace all = all[_N]
(6 real changes made)
. tab all, sort
all | Freq. Percent Cum.
------------+-----------------------------------
cow fox ox | 6 46.15 46.15
cow fox | 3 23.08 69.23
cow ox | 2 15.38 84.62
fox | 2 15.38 100.00
------------+-----------------------------------
Total | 13 100.00
. egen tag = tag(id)
. tab all if tag, sort
all | Freq. Percent Cum.
------------+-----------------------------------
cow fox ox | 2 40.00 40.00
cow fox | 1 20.00 60.00
cow ox | 1 20.00 80.00
fox | 1 20.00 100.00
------------+-----------------------------------
Total | 5 100.00
. groups id all
+-----------------------------------+
| id all Freq. Percent |
|-----------------------------------|
| 1 cow fox ox 3 23.08 |
| 2 fox 2 15.38 |
| 3 cow fox ox 3 23.08 |
| 4 cow ox 2 15.38 |
| 5 cow fox 3 23.08 |
+-----------------------------------+
groups
此处由用户编写,由ssc inst groups
安装。要按标识符计数,而不是观察,我们使用egen, tag()
标记每个标识符一次。
另一个直接的诀窍是申请wordcount()
。 drop
有条件地对这些结果进行ping标识符现在应该(更简单)。
如果字符串值包含空格,请根据需要使用其他一些连接标点符号,例如逗号,分号或冒号。