###################################################
问题:生成、操作数据框 18.4.27
怎么生成数据框 data.frame、,,及其相关操作 ???
解决方案:
iris[,2,drop = FALSE] #用drop参数,控制截取的子集所生成变量的格式,为单列的"数据框"
dfm1 <- cbind(c1,c2,c3,c4); #cbind 要求向量c1 c2 c3 c4长度必须一样。
dfm2 <- rbind(c1,c2,c3,c4) #将数据以行进行结合。要求数据列数一样。
# dfm1 和 dfm2 就互为转置。
as.data.frame(matrix)
#相关操作:
dfm[1,];
dfm[,2];
dfm[1:5,2];
dfm[1,2:5];
dfm[,c(2,4)];
dfm[,c(-2,-4)]; #均有效
dfm["name",]; #返回名为 “name” 的行
dfm[["name"]] #返回列名为 “name” 的列,一次只能返回一列
dfm$name #效果同上
讨论扩展:
行名重命名:row.names(iris1) <- iris1$ID
列名重命名:names(iris1)[names(iris1) == "temp"] <- "new_name"
aa = c(1,2,2,5,87);
Dfrm = data.frame(col1 = 2*aa,col2=aa+1,col3 = aa,col4=sqrt(aa))
#生成数据框,会按照最长的向量取其长度,短的自动循环补足
#data.frame特点:1、可以不影响原向量基础上改变数据;2、可以结合不同类型的数据;
另请参阅:
###################################################
问题:数据框 data.frame 重命名、增、删、改、等, 18.4.27
怎么对数据框 data.frame实施 增行列、删行列、改元素与赋值、 ???
解决方案:
行名重命名:row.names(iris1) <- iris1$ID
列名重命名:names(iris1)[names(iris1) == "temp"] <- "new_name"
#增加列 iris1 <- transform(iris1,log.SL=log(Sepal.Length)) #添加,修改数据。iris.add.col是数据集iris加上一列log.SL得到的。
iris1 <- cbind(iris1[,1:3],iris1$Species,iris1[,4:ncol(iris1)]) #插入到第四列,如果指定插入到某列后面,用行名查看指定的列是第几列,再执行本句
student$Age <- as.integer(format(Sys.Date(),”%Y”))-as.integer(format(student$Birthdate,”%Y”))
#删除列 iris.del.col <- transform(iris,Sepal.Length=NULL) #删除 Sepal.Length 列,新子集赋值给iris.del.col
iris.del.col2 <- subset(iris,select = -Sepal.Width) #删除 Sepal.Width 列,新子集赋值给iris.del.col2
iris$Sepal.Length=NULL
iris.del.col$Species <- iris.del.col$Petal.Width <- NULL #直接在原data.frame 删除了两列。
iris[c(-1,-3)] <- rep("NULL",length(iris)-2) #留下第一第三列,删除其他列。。。
#增加行 rbind()
v[length(v)+1] <- new_data
#删除行 iris.del.row <-iris[-8,]
iris.del.row <-iris[c(-1,-8),]
讨论扩展:
#找出最大元素的下标 which.max(x)
#等于6.0的元素的下标 which(x==6.0)
# 大于5的元素的下标 which(x>5)
#append(v,10,after=3)在第三个元素后面加入10,新向量 <- (原向量,新元素) ,添加元素的及合并向量
x=iris[,1];
x[x==5.1]<-25;
x #将x中等于5.1的元素变为25
x <- c(1,2,NA,4,5)
x[is.na(x)] <- 0
#合并文件,根据一列共同的标识符(比如唯一的id号)去合并两个变量。
#添加列:merge
ii = merge(inew,irisnew,by = "num",all = TRUE,sort=FALSE)
# all 为TRUE则取并集,无值补NA,,为FALSE则取交集。。 sort默认为T,即按照“num”排序。
#按共同标识符,即共同列 “num”,合并文件inew和irisnew,,第一个文件在前,后一个在后。
merge(x, y, by = c("k1","k2")) # ?merge 自带例子。
#添加行:rbind
total1 <- rbind(dataframeA, dataframeB)
#两个数据框必须有相同的变量,不过它们的顺序可以不一样。
另请参阅:
###################################################
问题:数据框 data.frame 查、排序等, 18.4.27
怎么对数据框 data.frame实施 查询位置、查询满足条件的个案数、、排序、 ???
解决方案:
#查询位置
weizhi <- which(iris$Sepal.Length >= 6.9) #返回一个向量
max(iris$Sepal.Length) #[1] 7.9
which(iris$Sepal.Length == max(iris$Sepal.Length)) #[1] 132
which(iris$Species == "setosa" & iris$Sepal.Length >= 5.1) #which 返回满足其内条件的元素的位置。
x[x==3]<-25;x #将x中等于3的元素变为25
x[x=1]<-12;x #将x的第1个元素数值变为12
which.max(a) # 找出最大元素的下标
which.min(a) # 找出大小的元素下标
which(a==2) # 等于2的元素的下标
which(a>5) # 大于5的元素的下标
a[which.max(a)] # 找出最大的元素
a[which(a>5)] # 所有的值大于5的元素
#查询满足条件的个案数
length(which(iris$Species == "setosa" & iris$Sepal.Length >= 5.1))
#排序
#order(); #输出原行号,按照要求排序后的向量 order返回的是排序后的索引。
order(iris$Sepal.Length) #[1] 9 4 7 3 2 10 5 8 1 6 ;返回原来的行号按照iris$Sepal.Length排序后的向量
inew = iris[order(iris$Sepal.Length),] #由于要对行排序,所以条件要写在 中括号内 行的位置。
inew2 = iris[order(iris$Sepal.Length,-iris2$Sepal.Width),] #默认升序 本例按iris$Sepal.Length升序,按iris$Sepal.Width降序。
#sort();输出排序后的结果。
讨论扩展:
sum(iris$Sepal.Length >= 6) #统计个数,统计iris$Sepal.Length中大于等于6的数有多少个
另请参阅:
###################################################
问题:筛选子集(行子集) 18.4.24
根据 data.frame 中某列,如何筛选满足条件的行,组成一个子集
解决方案:
cond <- iris$Species == "setosa" & iris$Sepal.Length >= 5.1 #筛选条件,,返回一个与 iris$Species 长度相同的布尔向量。满足条件的为TRUE。
# 和& 或| 不等于!= 大于> 小于< ,自由组合 #如果筛选对象是因子变量,需要带引号 == “”
筛选子集法一:用subset去子集
iris_setosa1 <- subset(iris,cond);
iris_setosa1 <- subset(iris,cond,select = c(1:3));
iris.del.col2 <- subset(iris,cond,select = -Sepal.Width)
iris.del.col2 <- subset(iris,cond,select = c(-Sepal.Width,-Petal.Width)) #以下均可:select = c(Sepal.Width,Petal.Width) select = c(Sepal.Width,5)
筛选子集法二:
iris_setosa2 <- iris[cond,];
newdata <- iris[which(cond),c(1,2,5)] #选择满足条件的行和列,一并生成新变量
讨论扩展:
对列筛选:
subset(dfrm,select=c(colname1,colname2,...,colnames),subset = (temp)); #同时实现对行、列的筛选。。内部subset对行进行筛选。
student[which(student$Gender==”F”),”Age”] #筛选后,只取“Age列”,条件得到一个布尔向量:FALSE FALSE TRUE,然后使用which函数可以将布尔向量中TRUE的Index返回,
#筛选:
iris..Species2 = iris[iris$Species == "setosa",] #等价,更常用。和& 或| 不等于!= 大于> 小于< ,自由组合
#如果筛选对象是因子变量,需要带引号 == “”
newdata <- iris[which(iris$Species =='setosa' & iris$Sepal.Length > 5.0),c(1,2,5)]
iris_6 <- subset(iris,iris$Sepal.Length >6 | iris$Sepal.Width>4,select = c(1:3))
另请参阅: