使用二进制值格式化data.frame
我有一个4列4行的数据框。为了简单起见,我将其更改为数字格式。模式如下:使用二进制值格式化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") 我想更改此数据框并获得以下信息: 是
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"))
dftapply
有趣地使用一些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"