如何重塑R中的以下数据帧

时间:2016-05-09 18:22:10

标签: r dataframe reshape

我有以下数据框:

原件:

ID  C1  C2  C3  C4  C5  C6  C7  C8
A11 0   1   0   0   0   0   1   0
A21 0   0   1   1   0   0   0   0
A31 0   0   0   0   1   0   1   0
A41 0   0   0   0   0   1   0   0
A51 0   0   0   0   0   1   0   0
A61 0   0   0   0   0   1   0   1
A71 0   0   1   1   0   0   0   0
A81 1   0   0   1   0   0   1   0
A91 0   1   0   1   0   0   0   1
A10 1   0   1   0   0   1   0   1

我最终希望以下列格式获取数据:

决赛:

A11 C2  C7

A21 C3  C4

A31 C5  C7  

A41 C6  

A51 C6

A61 C6  C8  

A71 C3  C4

A81 C1  C4  C7

A91 C2  C4  C8

A10 C1  C3  C6  C8

基本上,只要值!= 0,将该值替换为该列中变量的名称。有没有办法在R中完成上述工作?

谢谢!

1 个答案:

答案 0 :(得分:4)

这是一个使用ALTER TABLE footable WITH compaction = {'class': 'LeveledCompactionStrategy', 'sstable_size_in_mb': '256mb', 'tombstone_compaction_interval': '14400', 'unchecked_tombstone_compaction': 'true', 'tombstone_threshold': '0.05'} AND gc_grace_seconds = 14400 # assuming you will use everything in queue within this window of seconds 的方法,它返回一个列表,其中列表项名称是行名:

apply

使用此方法时,您需要确保数据中存在足够的变化。这是因为# construct reproducible example set.seed(1234) df <- data.frame(apple=sample(c(0,1), 10, replace=T), banana=sample(c(0,1), 10, replace=T), carrot=sample(c(0,1), 10, replace=T)) # give it some row names rownames(df) <- letters[1:10] # return the list myList <- apply(df, 1, function(i) names(df)[i!=0]) (和许多R函数一样)试图简化输出的数据类型。 @digemall提供的示例,

apply

返回一个矩阵,它有用,因为它提供了所需的信息,但不是预期的列表类型对象。一个更加阴险的例子如下:

df <- structure(list(ID = c("A11", "A21", "A31", "A41", "A51", "A61" ), 
                     C1 = c(1, 1, 1, 1, 1, 1), C2 = c(0, 0, 0, 0, 0, 0)),
                .Names = c("ID", "C1", "C2"), row.names = c(NA, 6L), class = "data.frame")

该方法将返回无用的字符向量。

一种更安全的方法,@ digemall建议使用df <- data.frame(apple=c(0,1), banana=c(1,0)) 来循环行。由于lapply始终会返回一个列表,因此我们不必担心以前的任何一个问题:

lapply

现在我们必须添加名称:

myList <- lapply(1:nrow(df),function(i)names(df)[df[i,]==1])