gpt4 book ai didi

r - 如何在列中的每一行字符串之前添加变量(列)名称

转载 作者:行者123 更新时间:2023-12-04 11:23:56 25 4
gpt4 key购买 nike

我想将列名添加到列中的每个字符串。这是要使用的小型数据框。

df <-structure(list(CoA = c("Baton Rouge", "Birmingham", "Chattanooga", 
"Columbia", "Houston"), CoB = c("Haddonfield, NJ", "Haddonfield, NJ",
"Philadelphia, PA", "Hackensack, NJ", "Princeton, NJ"), CoC = c("St. Louis, Missouri",
"Kansas City, Missouri", "Jefferson City, Missouri", "Belleville, Illinois",
"Overland Park, Kansas")), .Names = c("CoA", "CoB", "CoC"), row.names = c(NA,
-5L), class = "data.frame")

我尝试了以下方法,但 R 通过对象 company 和对象 df 进行回收。

company <- colnames(df)
new <- sapply(df, function(x) paste(company, x, sep = ", "))

这就是我想要的,但对于所有列:

paste(colnames(df[1]), df$CoA, sep = ", ")
[1] "CoA, Baton Rouge" "CoA, Birmingham" "CoA, Chattanooga" "CoA, Columbia" "CoA, Houston"

我尝试了各种正则表达式,但一无所获。如何让 sapply 在每一列上执行此粘贴操作?

最佳答案

这是一个可能的解决方案:

mx <- sapply(colnames(df),function(name){ paste(name,df[,name],sep=", ")})

> mx
CoA CoB CoC
[1,] "CoA, Baton Rouge" "CoB, Haddonfield, NJ" "CoC, St. Louis, Missouri"
[2,] "CoA, Birmingham" "CoB, Haddonfield, NJ" "CoC, Kansas City, Missouri"
[3,] "CoA, Chattanooga" "CoB, Philadelphia, PA" "CoC, Jefferson City, Missouri"
[4,] "CoA, Columbia" "CoB, Hackensack, NJ" "CoC, Belleville, Illinois"
[5,] "CoA, Houston" "CoB, Princeton, NJ" "CoC, Overland Park, Kansas"

请注意,sapply 返回一个矩阵;如果你想要一个 data.frame 就做 as.data.frame(mx)

解释:

sapply 将一个函数应用于第一个参数 X 中传递的向量/列表的每个元素(在本例中我们传递 colnames(df)).
应用于每个元素的函数通过参数 FUN 传递。
在这种情况下,我们将以下函数传递给 FUN:

function(name){ 
paste(name,df[,name],sep=", ")
# equivalent to return(paste(name,df[,name],sep=", "))
}

colname(df) 的每个元素调用此函数,并将每个元素作为第一个参数(即参数 name)传递。
因此,使用 name(记住是一个列名)我们选择 df 的一列,我们使用 paste 函数在列名前面加上我们返回字符串的结果向量。
剩下的留给 sapply 函数,它会自动将每个结果向量绑定(bind)到一个矩阵中(因为默认情况下 simplify=TRUE,否则会返回一个向量列表使用 lapply)

编辑:

正如@hadley 正确指出的那样,sapplysimplify=TRUE 的结果并不总是相同的(例如,如果只有一行或只有一栏)。
所以这是一个更安全的解决方案:

df2 <- as.data.frame(sapply(colnames(df),
function(name){ paste(name,df[,name],sep=", ")},
simplify=F))

> df2
CoA CoB CoC
1 CoA, Baton Rouge CoB, Haddonfield, NJ CoC, St. Louis, Missouri
2 CoA, Birmingham CoB, Haddonfield, NJ CoC, Kansas City, Missouri
3 CoA, Chattanooga CoB, Philadelphia, PA CoC, Jefferson City, Missouri
4 CoA, Columbia CoB, Hackensack, NJ CoC, Belleville, Illinois
5 CoA, Houston CoB, Princeton, NJ CoC, Overland Park, Kansas

关于r - 如何在列中的每一行字符串之前添加变量(列)名称,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25285303/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com