我想在数据框中按行列出。在以下示例中,可以使用table中的apply获得足够的结果:

df.1 <- read.table(text = '
  state  county  city  year1  year2  year3  year4  year5
      1       2     4      0      0      0      1      2
      2       5     3     10     20     10     NA     10
      2       7     1    200    200     NA     NA    200
      3       1     1     NA     NA     NA     NA     NA
', na.strings = "NA", header=TRUE)

tdf <- t(df.1)
apply(tdf[4:nrow(tdf),1:nrow(df.1)], 2, function(x) {table(x, useNA = "ifany")})


结果如下:

[[1]]
x
0 1 2
3 1 1

[[2]]
x
  10   20 <NA>
   3    1    1

[[3]]
x
 200 <NA>
   3    2

[[4]]
x
<NA>
   5


但是,在下面的示例中,每一行都包含一个值。

df.2 <- read.table(text = '
  state  county  city  year1  year2  year3  year4  year5
      1       2     4      0      0      0      0      0
      2       5     3      1      1      1      1      1
      2       7     1      2      2      2      2      2
      3       1     1     NA     NA     NA     NA     NA
', na.strings = "NA", header=TRUE)

tdf.2 <- t(df.2)
apply(tdf.2[4:nrow(tdf.2),1:nrow(df.2)], 2, function(x) {table(x, useNA = "ifany")})


我得到的输出是:

# [1] 5 5 5 5


因此,我不能从此输出中看出前5个代表0,后5个代表1,第3个5代表2,最后5个代表NA。有没有一种方法可以让R返回第二个示例中每个5表示的值?

最佳答案

这是一个table解决方案:

table(
    rep(rownames(df.1),5),
    unlist(df.1[,4:8]),
    useNA="ifany")


这给

    0 1 2 10 20 200 <NA>
  1 3 1 1  0  0   0    0
  2 0 0 0  3  1   0    1
  3 0 0 0  0  0   3    2
  4 0 0 0  0  0   0    5


...以及您的df.2

    0 1 2 <NA>
  1 5 0 0    0
  2 0 5 0    0
  3 0 0 5    0
  4 0 0 0    5


好吧,这是一个解决方案,除非您出于某种原因真的很喜欢有一个表列表。

关于r - 带R的表格,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/16825216/

10-12 23:21