4

编辑:我应该生成更好的数据。字符串变量不一定是destring能够的。我只是在这里偷懒(我不知道如何生成随机字母)。


我有一个包含很多我想要的字符串的数据集collapse,但似乎通常collapse不能很好地放置字符串,尤其是(firstnm)and (count)。这里有一些类似的数据。

clear
set obs 9
generate mark = .
replace mark = 1 in 1
replace mark = 2 in 6
generate name = ""
generate random = ""
local i = 0
foreach first in Tom Dick Harry {
    foreach last in Smith Jones Jackson {
        local ++i
        replace name = "`first' `last'" in `i'
        replace random = string(runiform())
    }
}

我想collapse在“标记”上,这很简单,带有replace下标。

replace mark = mark[_n - 1] if missing(mark)

但是我collapse的失败并type mismatch出现错误。

collapse (firstnm) name (count) random, by(mark)

如果我使用(first),则第一个错误会清除,但(count)仍然失败。是否有避免额外by操作的解决方案?

似乎以下工作有效,但对我的数据来说也会更耗时。

generate nonmissing_random = !missing(random)
egen  nonmissing_random_count = count(nonmissing_random), by(mark)
collapse (first) name nonmissing_random_count, by(mark)

或者是否有任何有助于使用collapse相同的解决方案?

4

2 回答 2

2

您可以使用destring random,replace,然后进行以下工作:

collapse (first) name (count) random, by(mark) 

mark    name    random
1   Tom Smith   5
2   Dick Jackson    4

collapse (firstnm) name (count) random, by(mark)仍然会产生不匹配错误。

于 2013-09-26T22:45:57.073 回答
1

再想一想,我egen count的 withby操作是没有必要的。我可以为非缺失/缺失字符串变量生成一个 1/0 变量,然后(sum)在折叠中使用。

generate nonmissing_random = !missing(random)
collapse (first) name (sum) nonmissing_random, by(mark)
于 2013-09-27T08:59:01.120 回答