我有一个具有不同列的数据框,这些列是组,这些列的单元格是属于列组的物种.我需要将它转换成一个二进制矩阵,其中列仍然是标题(组),但行将是物种,如果一个物种最初是在该列组中,它将是1,否则将是0.

# Load the dplyr package
library(dplyr)

# Create a list of vectors with different lengths
list_of_vectors <- list(
  Z1 = c("E","F","G"),
  Z2 = c("A", "B", "C", "D"),
  Z3 = c("H","I","J","K","L")
)

# Find the maximum length
max_length <- max(sapply(list_of_vectors, length))

# Pad the vectors with NA to make them the same length
padded_vectors <- lapply(list_of_vectors, function(x) c(x, rep(NA, max_length - length(x))))

# Create the data frame using dplyr
df <- as.data.frame(bind_cols(padded_vectors))

I want to go FROM this:

# data frame
   Z1   Z2    Z3
1   E    A     H
2   F    B     I
3   G    C     J
4   NA   D     K
5   NA   NA    L

to this:

# binary matrix
   Z1   Z2  Z3
E  1    0    0
F  1    0    ...
G  1    0
A  0    1
B  0    1
C  0    1
D  ..   1
H       0    1
I            1
J            ...
K
L

谢谢!

推荐答案

out <- +sapply(df, `%in%`, x = sort(unique(na.omit(unlist(df)))))
rownames(out) <- sort(unique(na.omit(unlist(df))))
out
#   Z1 Z2 Z3
# A  0  1  0
# B  0  1  0
# C  0  1  0
# D  0  1  0
# E  1  0  0
# F  1  0  0
# G  1  0  0
# H  0  0  1
# I  0  0  1
# J  0  0  1
# K  0  0  1
# L  0  0  1

或者作为一句俏皮话:

with(list(r = sort(unique(na.omit(unlist(df))))), 
     `rownames<-`(+sapply(df, `%in%`, x = r), r))

备注:

  • 我加了na.omit,因为我不认为你想知道NA在哪里.如果你认为有用的话就交给你.

  • 我添加了sort,因为我认为它在视觉上更有意义,但它完全是可选的.

  • unique不是严格要求,但如果不使用它,将生成同名的行.

最后,这是一个presence的指示器,这意味着如果我们有一个字母在一栏中重复,我们只看到1:

df$Z2[1] <- "B"
with(list(r = sort(unique(na.omit(unlist(df))))), `rownames<-`(+sapply(df, `%in%`, x = r), r))
#   Z1 Z2 Z3
# B  0  1  0
# C  0  1  0
# D  0  1  0
# E  1  0  0
# F  1  0  0
# G  1  0  0
# H  0  0  1
# I  0  0  1
# J  0  0  1
# K  0  0  1
# L  0  0  1

如果你需要count分,那么我们需要

with(list(r = sort(unique(na.omit(unlist(df))))), 
     `rownames<-`(sapply(df, function(col) colSums(outer(col, r, `==`), na.rm = TRUE)), r))
#   Z1 Z2 Z3
# B  0  2  0
# C  0  1  0
# D  0  1  0
# E  1  0  0
# F  1  0  0
# G  1  0  0
# H  0  0  1
# I  0  0  1
# J  0  0  1
# K  0  0  1
# L  0  0  1

数据

df <- structure(list(Z1 = c("E", "F", "G", NA, NA), Z2 = c("A", "B", "C", "D", NA), Z3 = c("H", "I", "J", "K", "L")), row.names = c(NA, -5L), class = "data.frame")

R相关问答推荐

如何提高以键ID为列的表中键查找的效率?

在ggplot Likert条中添加水平线

如何计算前一行的值,直到达到标准?

为什么在ggplot2中添加geom_text这么慢?

用值序列对行进行子集化,并标识序列开始的列

par函数中的缩写,比如mgp,mar,mai是如何被破译的?

非线性混合效应模型(NLME)预测变量的置信区间

R中的哈密顿滤波

使用for循环和粘贴创建多个变量

如何识别倒排的行并在R中删除它们?

为什么我使用geom_density的绘图不能到达x轴?

如何在R中平滑地绘制线图(不拟合)?

删除在R中的write.table()函数期间创建的附加行

计算来自单独分组的分幅的值的百分位数

在同一单元格中创建包含整数和百分比的交叉表

使用&Fill&Quot;在gglot中创建 colored颜色 渐变

如何在访问之前下载的输入时同时上传和处理所有指定的shiny 输入?

随机生成样本,同时在R内的随机样本中至少包含一次所有值

在一个multiplot中以非对称的方式在R中绘制多个图

使用显式二元谓词子集化sfc对象时出错