0%

R语言中的数据框处理

R语言中的数据框处理

dplyr包

处理变量的函数(处理列)

select

1
2
3
4
5
6
data1 <- starwars %>% select(name,height,mass,sex,species,films) #名字全列出来
data2 <- starwars %>% select(name:mass) #直接选取范围
data3 <- starwars %>% select(1:6)
data4 <- starwars %>% select(1:3,7:8)
data5 <- starwars %>% select(name, species, contains("color")) #按照字符的包含条件筛选
data6 <- starwars %>% select(name, height, weight = mass) #还可以选取的同时直接重命名,注意新旧名字的前后顺序

可以根据变量的名字筛选,或者对变量重新命名。

mutate

1
data13 <- data1 %>% mutate(BMI = mass/((height/100)^2)) %>% arrange(-BMI)

可以新增加一个变量追加到数据框的最后一列,也就是新建一列。

筛选个案(处理行)

filter

1
2
3
4
data8 <- starwars %>% select(name,height,mass,sex,species) %>% filter(species == "Droid") %>% arrange(height)  
data9 <- starwars %>% select(name,height,mass,sex,species) %>% filter((species == "Human" | species == "Droid") & height < 200) %>% arrange(height) # “|”表示或者,“,“和“&”表示且
data9 <- starwars %>% select(name,height,mass,sex,species) %>% filter((species %in% c("Human" ,"Droid")) & height < 200) %>% arrange(height) # %in%也可以达到上面相同的效果
data9 <- starwars %>% select(name,height,mass,sex,species) %>% filter(!is.na(height)) %>% arrange(height) #"!"表示取相反的,所以这项命令通过filter保留了没有NA的行

可以根据变量的结果筛选个案,也就是通过列来筛选行。

arrange

1
data8 <- starwars %>% select(name,height,mass,sex,species) %>% filter(species == "Droid") %>% arrange(-height)  #降序

同上,可以通过某变量的值来排序,调整个案的顺序,也就是通过列的值来排序行。

处理单元格数据

if_else

1
2
3
data14 <- data13 %>% drop_na(mass) %>% mutate(weight_size = if_else(mass > 100 , 
"large",
"small")) #drop_na把有mass列中NA的行删掉了

可以根据变量的数值来进行条件转换,比如上面的例子就是检测mass是否大于100,如果大于就在新增加的一列weight_size中命名为large,否则则为small。

recode

1
2
data15 <- data14 %>% mutate(weight_size = recode(weight_size, "large"=1 ,
"small"=2))

可以根据单元格中的内容成组转换,比如将large体型转化为1,small体型转化为2。

reshape2包

melt

1
melt(MASS::ships, id.vars = c("type","year"))

将宽数据框转化为长数据。

  • Id.vars 标识变量,也就是不想变的列名(不想变的变量)
  • measure.vars 度量变量,也就是要展开的列名(如果不特殊指定的话就是上面id.vars的补集)
  • variable.name 对度量变量那一列变换后的命名,默认为variable
  • na.rm 是否删除缺失值
  • value.name 对度量变量值那一列的命名,默认为value

其实就是把measure.vars中的多个列合成一个列。m列n行的数据框,如果指定一个量度变量那么最后的长数据表就会是3列n(m-1)行,指定两个就会是4列n(m-2)行。

cast

1
ships_melt_dcast <- dcast(ships_melt, year + variable ~ type, fun.aggregate = mean)

将长数据转化为宽数据。

  • formula 描述最后想要的结果, a + b …. ~ c + d ….. a和b定义了确定各行内容,c和d确定了各列的内容
  • fun.aggregate 数据整合函数,平均值等
  • value.var 指定储存value的那一列,默认是剩下的最后一个列

其实相当于减少了一个或多个变量(一个列),将一列拆分成了多个列,也就是a、b不懂,将c、d两列拆分为多个列。主要还是要看将数据框变形的目的是什么,是为了看什么数值之间的关系。

tidyr包

gather

1
2
3
4
5
data <- data.frame(Patient = c("Patient1","Patient2","Patient3","Patient4"),
t0 = c(189,170,135,145), t1 = c(160,140,127,120),
t2 = c(156,145,133,140), t3 = c(160,155,140,120))

data1 <- gather(data, key = "time", value = SPB, t0,t1,t2,t3)

将宽数据转化为长数据

  • key 表示合并后的列的名字
  • value 表示合并后储存值的那一列的名字
  • t0 - t3 表示需要合并的列

spread

1
data2 <- spread(data1, key = time, value = SPB)

将长数据转化为宽数据

  • key 表示需要被拆分为多个列的那一列列名
  • value 表示指定储存值的一列

unite

1
data3 <- unite(data = data1, col = ptime, Patient, time, SPB, remove = F, sep = "-")

可以将多列的数据合并为一列

  • col 表示新合成的列的名字
  • Patient, time, SPB 表示需要合成的列
  • remove 表示合成后是否需要删除用来合成的列
  • sep 表示多列合成中所使用的间隔符

separate

1
data4 <- separate(data = data3, col = ptime, sep = "-", into = c("patient","time"), remove = F)

可以将一列拆分成多列

  • col 表示接受拆分的列
  • sep 表示根据什么字符来拆分
  • into 表示拆分后的列名叫什么,输入向量可以表示多个列名极其顺序
  • remove 表示拆分后是否保留原始被拆分的列

pivot_longer

1
2
3
4
data2 %>% pivot_longer(cols = t0:t3, 
names_to = "time",
values_to = "SPB"
)

可以将宽数据转化为长数据,貌似这个函数比上面提到的几个都要好用

  • data 表示输入的数据框
  • cols 表示需要合并的列是那些
  • names_to 表示合并后的列名
  • values_to 表示合并后保留值的那一列的名称

pivot_wider

1
2
3
population %>% pivot_wider(id_cols = year, 
names_from = country,
values_from = population)
  • id_cols 表示不动的列,即用什么个案来识别不同的观测
  • names_from 表示要展开成多列的列名
  • values_from 表示展开后的值是由哪一列中提取的value
  • values_fn 表示如果值不唯一,用什么函数进行计算(mean、sum等)