我有以下数据框:
原件:
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中完成上述工作?
谢谢!
答案 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])