R语言 把列中的值转换为数据框架的行名
R语言中的行名默认映射为行号,以整数值1开始。行名可以很容易地被修改,并重新分配给任何可能的字符串向量,以分配自定义的名称。由于行号在数据框架的每一列中实际上是相等的,因此列值也可以分配给R中的行名。
方法1:使用rownames()方法
R中的rownames()方法被用来为数据框架分配行名。它是用一个字符向量来分配的,该向量由所需的名字组成,其长度相当于数据框架中的行数。我们可以简单地将其分配给数据框架的任何一列,如果它包含所有唯一的值。可以使用标准的索引方法访问该列,即df$col_name
或df[,col_indx]
。这些变化都是对原始数据框架进行的。row.names(df)也可以用来代替rownames()方法。
语法:
rownames(df)/row.names(df) <- df$col_name
rownames(df)/row.names(df) <- df[,col_indx]
例子
data_frame <- data.frame(col1=letters[1:4],
col2=6,col3=c(5:8))
print("Original dataframe")
print(data_frame)
# reassigning row names
rownames(data_frame) <- data_frame$col1
print("Modified dataframe")
print(data_frame)
输出
[1] "Original dataframe"
col1 col2 col3
1 a 6 5
2 b 6 6
3 c 6 7
4 d 6 8
[1] "Modified dataframe"
col1 col2 col3
a a 6 5
b b 6 6
c c 6 7
d d 6 8
然而,如果我们试图在这种情况下将col2分配为数据框架的行名,R代码会抛出一个异常,因为重复的行名是不允许的,因此一个重要的条件是,列值必须是唯一的,以便将它分配给数据框架的行名。
Error in `.rowNamesDF<-`(x, value = value) :
duplicate 'row.names' are not allowed
Calls: rownames<- ... row.names<- -> row.names<-.data.frame -> .rowNamesDF<-
In addition: Warning message:
non-unique value when setting 'row.names': ‘6’
Execution halted
方法2:使用tiddle
tiddle包可以安装在工作空间中,以便对数据框架的行名进行操作。首先,这个包中的remove_rownames方法被应用在数据框架上,它删除了对现有行名的引用,然后调用column_to_rownames()方法。它的参数是列名,我们希望将其值分配给数据框架的行名。然而,这些变化必须存储在原始数据框架中,以便进一步使用。
例子
library(tidyverse)
data_frame <- data.frame(col1=letters[1:4],
col2=6,col3=c(5:8))
print("Original dataframe")
print(data_frame)
data_frame <- data_frame %>% remove_rownames %>% column_to_rownames(var="col1")
print("Modified dataframe")
print(data_frame)
输出
[1] "Original dataframe"
col1 col2 col3
1 a 6 5
2 b 6 6
3 c 6 7
4 d 6 8
[1] "Modified dataframe"
col1 col2 col3
a a 6 5
b b 6 6
c c 6 7
d d 6 8
方法3:使用row.names作为创建数据框架的参数
一个新的数据框架可以使用现有的数据框架创建,它的参数是row.names属性映射到列,其值被映射到行名。然而,这将导致从数据框架中删除该列,并且,列的数量将因此减少1。因此,这种方法可能会导致数据的不明确性。
例子
data_frame <- data.frame(col1=letters[1:4],
col2=6,col3=c(5:8))
print("Original dataframe")
print(data_frame)
# reassigning row names
data_frame <- data.frame(data_frame, row.names = 3)
print("Modified dataframe")
print(data_frame)
输出
[1] "Original dataframe"
col1 col2 col3
1 a 6 5
2 b 6 6
3 c 6 7
4 d 6 8
[1] "Modified dataframe"
col1 col2
5 a 6
6 b 6
7 c 6
8 d 6