使用二进制值格式化data.frame

使用二进制值格式化data.frame,r,dataframe,R,Dataframe,我有一个4列4行的数据框。为了简单起见,我将其更改为数字格式。模式如下: df <- structure(list(a = c(1,2,2,0), b = c(2,1,2,2), c = c(2,0,1,0), d = c(0,2,1,1)),row.names=c(NA,-4L) ,class = "data.frame") 我想更改此数据框并获得以下信息: 是

我有一个4列4行的数据框。为了简单起见,我将其更改为数字格式。模式如下:

df <- structure(list(a = c(1,2,2,0),
                     b = c(2,1,2,2),
                     c = c(2,0,1,0),
                     d = c(0,2,1,1)),row.names=c(NA,-4L) ,class = "data.frame")
我想更改此数据框并获得以下信息:


是否有我应该研究的功能或包?最近我在R做了很多文本处理。谢谢你的帮助

使用
dplyr
tidyr
的一种方法是获取长格式数据,删除0个值,并将每行和值组合的列名粘贴在一起。最后得到宽格式的数据

library(dplyr)
library(tidyr)

df %>%
  mutate(row = row_number()) %>%
  pivot_longer(cols = -row) %>%
  filter(value != 0) %>%
  group_by(row, value) %>%
  summarise(val = paste(name, collapse = "/")) %>%
  pivot_wider(names_from = value, values_from = val)

#    row `1`   `2`  
#  <int> <chr> <chr>
#1     1 a     b/c  
#2     2 b     a/c/d
#3     3 c     a    
#4     4 c/d   b    
库(dplyr)
图书馆(tidyr)
df%>%
变异(行=行编号())%>%
枢轴长度(cols=-行)%>%
过滤器(值!=0)%>%
分组依据(行,值)%>%
摘要(val=paste(name,collapse=“/”)%%
枢轴(名称从=value,值从=val)
#第'1``2'行
#    
#1 a b/c
#2 b a/c/d
#3 c a
#4 c/d b
数据

df <- structure(list(a = c(1L, 2L, 2L, 0L), b = c(2L, 1L, 0L, 2L), 
c = c(2L, 2L, 1L, 1L), d = c(0L, 2L, 0L, 1L)), class = "data.frame", 
row.names = c("1", "2", "3", "4"))

df
tapply
有趣地使用一些
row
col
索引(从Ronak的答案中窃取
df
):


基本上,我取一个长向量,表示
df
中的每个列名,并通过
df
行和
df
中的原始值的组合将其制成表格,每行有3个级别:c(0,1,2)。我想将这些级别转换为列。我正在处理的实际文件有0,1,2列,但还有更多列。因此,我将其重塑为一个包含3列的数据框,并将以前的列名转换为值。如果一个数字在一行中出现多次,我将写入相关列名,并用“/”分隔。数据框不正确。最后一行是0,2,0,1。刚刚更正它!对不起!这实际上解决了问题的第二部分,即我有第二个data.frame,我正在使用第一个data.frame进行转换。这对问题的第二部分起到了作用,我想根据此元数据对第二个矩阵进行排序。
library(dplyr)
library(tidyr)

df %>%
  mutate(row = row_number()) %>%
  pivot_longer(cols = -row) %>%
  filter(value != 0) %>%
  group_by(row, value) %>%
  summarise(val = paste(name, collapse = "/")) %>%
  pivot_wider(names_from = value, values_from = val)

#    row `1`   `2`  
#  <int> <chr> <chr>
#1     1 a     b/c  
#2     2 b     a/c/d
#3     3 c     a    
#4     4 c/d   b    
df <- structure(list(a = c(1L, 2L, 2L, 0L), b = c(2L, 1L, 0L, 2L), 
c = c(2L, 2L, 1L, 1L), d = c(0L, 2L, 0L, 1L)), class = "data.frame", 
row.names = c("1", "2", "3", "4"))
tapply(
  colnames(df)[col(df)],
  list(row(df), unlist(df)),
  FUN=paste, collapse="/"
)[,-1]

#  1     2      
#1 "a"   "b/c"  
#2 "b"   "a/c/d"
#3 "c"   "a"    
#4 "c/d" "b"