R语言中tidyverse包中gather函数(将数据转换为一列)

 

001、

library(tidyverse)                                         ## 加载包
dat <- data.frame(a = c(400, 100, 300, 500),               ## 测试数据框
                  b = c("xxx", "mmm", "nnn", "yyy"),
                  c = c(333, 777, 888, 222))
dat
gather(dat, key = 'items',value = 'values')                ## 利用gather函数将dat数据框转换为一列

 

 

002、手动函数实现

dat <- data.frame(a = c(400, 100, 300, 500),                     ## 测试数据框
                  b = c("xxx", "mmm", "nnn", "yyy"),
                  c = c(333, 777, 888, 222))
dat
result <- data.frame()
for (i in 1:ncol(dat)) {                                         ## 利用循环实现
  for (j in 1:nrow(dat)) {
    result <- rbind(result, c(colnames(dat)[i],dat[j,i]))  
  }
}
names(result) <- c("items", "values")
result    

 

003、shell实现

(base) root@PC1:/home/test2# ls
a.txt
(base) root@PC1:/home/test2# cat a.txt
a       b       c
400     xxx     333
100     mmm     777
300     nnn     888
500     yyy     222
(base) root@PC1:/home/test2# head -n 1 a.txt | xargs -n 1 | cat -n | while read {i,j}; do awk -v a=$i -v b=$j 'NR > 1{print b, $a}' a.txt; done
a 400
a 100
a 300
a 500
b xxx
b mmm
b nnn
b yyy
c 333
c 777
c 888
c 222

 

004、python实现

(base) root@PC1:/home/test2# ls
a.txt  test.py
(base) root@PC1:/home/test2# cat a.txt             ## 测试数据
a       b       c
400     xxx     333
100     mmm     777
300     nnn     888
500     yyy     222
(base) root@PC1:/home/test2# cat test.py           ## 测试脚本
#!/usr/bin/python
in_file = open("a.txt", "r")
in_file2 = open("a.txt", "r")
list1 = in_file2.readlines()[0].strip().split()
data = in_file.readlines()[1::]

length = len(data[0].strip().split())
dict1 = {}
for i in range(length):
    dict1[i] = []
for i in data:
    i = i.strip().split()
    for j in range(length):
        dict1[j].append(i[j])
for i,j in dict1.items():
    for k in j:
        print(list1[i], k)

in_file.close()
in_file2.close()
(base) root@PC1:/home/test2# python test.py      ## 执行程序
a 400
a 100
a 300
a 500
b xxx
b mmm
b nnn
b yyy
c 333
c 777
c 888
c 222

 

posted @ 2022-08-25 21:53  小鲨鱼2018  阅读(1216)  评论(0编辑  收藏  举报