1

请让我知道可以重新排列数据的“R代码”

AA 100 NA
BB 200 300
CC 300 NA
DD 100 400

AA 100 0   0   0
BB 0   200 300 0
CC 0   0   300 0
DD 100 0   0   400

或者

   100 200 300 400
AA 1   0   0   0
BB 0   1   1   0
CC 0   0   1   0
DD 1   0   0   1
4

3 回答 3

6
df <- read.table(text = "AA 100 NA
BB 200 300
CC 300 NA
DD 100 400")

table(data.frame(letters = df[,1], numbers = unlist(df[,-1])))
#        numbers
# letters 100 200 300 400
#      AA   1   0   0   0
#      BB   0   1   1   0
#      CC   0   0   1   0
#      DD   1   0   0   1
于 2012-12-11T07:27:41.087 回答
3
# SAMPLE DATA
myDF <- structure(list(V2 = c(100L, 200L, 300L, 100L), V3 = c(NA, 300L, NA, 400L)), .Names = c("V2", "V3"), class = "data.frame", row.names = c("AA", "BB", "CC", "DD"))

假设myDf是您的原始数据框

# create columns sequence
Columns <- seq(100, 400, by=100)

newMat <- sapply(Columns, function(c) rowSums(c==myDF, na.rm=T))

# assign names
colnames(newMat) <- Columns

newMat  
#      100 200 300 400
#   AA   1   0   0   0
#   BB   0   1   1   0
#   CC   0   0   1   0
#   DD   1   0   0   1


解释:

c == myDF给出 TRUE/FALSE 值的矩阵.
如果您对 T/F 进行算术运算,它们将被视为 1/0
。因此,我们可以rowSum()对每一行 AA、BB 等取
,这将告诉我们每行等于 c 的次数。

我们使用sapply迭代每个列值,100、200 等
lapply为我们返回一个列表
sapply,获取该列表并将其简化为一个漂亮的矩阵。

然后我们清理名称以使事情变得漂亮。

于 2012-12-11T07:07:16.067 回答
0

要获取这些值,还可以使用 reshape2 包:

DF <- read.table(text = "AA 100 NA
 BB 200 300
 CC 300 NA
 DD 100 400")

library(reshape2)
dfm <- melt(DF, id = "V1")

dcast(dfm, V1 ~ factor(value), fill = 0)[, -6]
  V1 100 200 300 400
1 AA 100   0   0   0
2 BB   0 200 300   0
3 CC   0   0 300   0
4 DD 100   0   0 400

dcast() 中的最后一列被删除,因为 NA 是 dfm$value 中的一个值,并且占据了转换数据帧中的最后一列。

于 2012-12-12T05:58:13.947 回答