如何使用 R 将数据 table 中的列属性与查找 table 中的列值匹配
How to match column attribute in a data table to a column value in a lookup table with R
这应该很简单,但我想不通。
我有一个包含 N 列的数据 table 和一个包含两列的查找 table:New.Name 和数字。我想将数据 table 中的列重命名为 table 在查找 table 中找到的按数字匹配的 New.Name。并非所有列名称在查找 table 中都会有 New.Name。数据 table 中的数字存储为列属性。因此,我需要将数据 table 中的列属性与查找 table.
中 Number 列中找到的值相匹配
示例:
df <- as.data.frame(matrix(sample(1:20), ncol = 5))
colnames(df) <- c('abc', 'def', 'ghi', 'jkl', 'mno')
for (i in 1:5) attr(df[,i], 'Number') <- i
lookup <- data.frame(Number=c(2,3),New.Name=c('x','y'))
根据上面的示例,将列 def 和列 ghi 重命名为 x 和 y 的最佳方法是什么?
没那么容易...也许这行得通:
colnames(df)[sapply(lookup$Number, function(x) which(sapply(df,attr, 'Number')==x))] <- as.character(lookup$New.Name)
我们可以通过
names(df)[match(lookup$Number, unlist(lapply(df, attributes)) )] <- as.character(lookup$New.Name)
names(df)
#[1] "abc" "x" "y" "jkl" "mno"
这应该很简单,但我想不通。
我有一个包含 N 列的数据 table 和一个包含两列的查找 table:New.Name 和数字。我想将数据 table 中的列重命名为 table 在查找 table 中找到的按数字匹配的 New.Name。并非所有列名称在查找 table 中都会有 New.Name。数据 table 中的数字存储为列属性。因此,我需要将数据 table 中的列属性与查找 table.
中 Number 列中找到的值相匹配示例:
df <- as.data.frame(matrix(sample(1:20), ncol = 5))
colnames(df) <- c('abc', 'def', 'ghi', 'jkl', 'mno')
for (i in 1:5) attr(df[,i], 'Number') <- i
lookup <- data.frame(Number=c(2,3),New.Name=c('x','y'))
根据上面的示例,将列 def 和列 ghi 重命名为 x 和 y 的最佳方法是什么?
没那么容易...也许这行得通:
colnames(df)[sapply(lookup$Number, function(x) which(sapply(df,attr, 'Number')==x))] <- as.character(lookup$New.Name)
我们可以通过
names(df)[match(lookup$Number, unlist(lapply(df, attributes)) )] <- as.character(lookup$New.Name)
names(df)
#[1] "abc" "x" "y" "jkl" "mno"