R语言中的数据框处理
dplyr包
处理变量的函数(处理列)
select
1 | data1 <- starwars %>% select(name,height,mass,sex,species,films) #名字全列出来 |
可以根据变量的名字筛选,或者对变量重新命名。
mutate
1 | data13 <- data1 %>% mutate(BMI = mass/((height/100)^2)) %>% arrange(-BMI) |
可以新增加一个变量追加到数据框的最后一列,也就是新建一列。
筛选个案(处理行)
filter
1 | data8 <- starwars %>% select(name,height,mass,sex,species) %>% filter(species == "Droid") %>% arrange(height) |
可以根据变量的结果筛选个案,也就是通过列来筛选行。
arrange
1 | data8 <- starwars %>% select(name,height,mass,sex,species) %>% filter(species == "Droid") %>% arrange(-height) #降序 |
同上,可以通过某变量的值来排序,调整个案的顺序,也就是通过列的值来排序行。
处理单元格数据
if_else
1 | data14 <- data13 %>% drop_na(mass) %>% mutate(weight_size = if_else(mass > 100 , |
可以根据变量的数值来进行条件转换,比如上面的例子就是检测mass是否大于100,如果大于就在新增加的一列weight_size中命名为large,否则则为small。
recode
1 | data15 <- data14 %>% mutate(weight_size = recode(weight_size, "large"=1 , |
可以根据单元格中的内容成组转换,比如将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 | data <- data.frame(Patient = c("Patient1","Patient2","Patient3","Patient4"), |
将宽数据转化为长数据
- 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 | data2 %>% pivot_longer(cols = t0:t3, |
可以将宽数据转化为长数据,貌似这个函数比上面提到的几个都要好用
- data 表示输入的数据框
- cols 表示需要合并的列是那些
- names_to 表示合并后的列名
- values_to 表示合并后保留值的那一列的名称
pivot_wider
1 | population %>% pivot_wider(id_cols = year, |
- id_cols 表示不动的列,即用什么个案来识别不同的观测
- names_from 表示要展开成多列的列名
- values_from 表示展开后的值是由哪一列中提取的value
- values_fn 表示如果值不唯一,用什么函数进行计算(mean、sum等)