我有一个这样的df:
df1 <- data.frame(c(3,NA,5), c(NA, NA, 3), c(3, 2, NA))
names(df1) <- c('number1', 'number2', 'number3')
rownames(df1) <- c('siteA', 'siteB', 'siteC')
字符串
我想做一个新的df,其中行和列名是由不NA的值组合而成的。生成的df应该如下所示:
df2 <- data.frame('number' = c('number1', 'number1', 'number2', 'number3', 'number3'),
'site' = c('siteA', 'siteC', 'siteC', 'siteA', 'siteB'))
型
我如何尽可能高效地做到这一点?(我的真实的df是巨大的)
4条答案
按热度按时间slwdgvem1#
在矩阵或表格中,每个轴可以具有名称,该名称是标记该轴的字符串。将df1转换为矩阵m并将它们相加。
然后使用
as.data.frame.table
将其转换为长格式,并删除NA的行。as.data.frame.table
将添加名为Freq
的第三列,这是我们不需要的,因此只选择前2列,并且由于问题将数字放在第一位,因此将提取的两列的顺序颠倒。字符串
m
看起来像这样。注意dimnames。型
7ajki6be2#
使用
tidyverse
的简单方法:字符串
s3fp2yjn3#
你也可以在这里使用
which()
。首先,你找到data.frame中没有丢失的行(不需要先将其转换为矩阵),然后用arr.ind = TRUE
得到索引。这些索引是具有非NA值的数据的行和列。这样做的另一个好处是row.names将是原始data.frame
的row.names。我将矩阵输出转换为具有正确变量名的data.frame,然后将列和行名称中的值分配给数字。字符串
乐趣基准:
型
的数据
wh6knrhe4#
我们可以尝试
expand.grid
+dimnames
字符串