【问题标题】:Converting character to factor using lapply with no melting使用 lapply 将字符转换为因子而不熔化
【发布时间】:2013-12-02 21:00:12
【问题描述】:

我有一个字符矩阵列表,想将其中的两列(纬度、经度)转换为因子。我已经尝试为此使用 lapply 并且它有效,但它也重塑了我的数据框。我尝试过使用 as.factor 两种方法:一种仅在两个所需的列上(不好,将所有其他列返回为 NA),另一种在整个数据帧上,但在两种情况下都会发生整形。然后我尝试将我的矩阵列表恢复为原始的所需形状,但认为最好不要创建原始问题而不是在事后尝试修复它。关于如何在不发生重塑的情况下转换为因子的任何想法?

尝试仅列:

ix <- 5:6
mytest[ix] <- lapply(mytest[ix], as.factor)

尝试整个df

lapply(mytest, as.factor)

样本数据:

list(structure(c("study1", "study1", "study1", "study1", "study1", 
"study1", "study1", "study1", "study1", "study1", "study1", "study1", 
"study1", "study1", "study1", "58", "58", "58", "58", "58", "58", 
"58", "58", "58", "58", "58", "58", "58", "58", "58", "2011-07-13", 
"2011-07-13", "2011-07-13", "2011-07-13", "2011-07-13", "2011-07-13", 
"2011-07-13", "2011-07-13", "2011-07-13", "2011-07-13", "2011-07-13", 
"2011-07-13", "2011-07-13", "2011-07-13", "2011-07-13", "321", 
"329", "323", "324", "61", "326", "6", "60", "49", "10", "7", 
"59", "57", "56", "11", "32.884720435", "32.8841969254545", "32.8835599674286", 
"32.88419565", "32.8837771221667", "32.88411147", "32.883244695", 
"32.8837003266667", "32.8838778530086", "32.8853723146154", "32.8027296698536", 
"32.9164754136842", "32.8853777533333", "32.8854051", "32.802755201875", 
"-117.24062533", "-117.240416713636", "-117.240532619714", "-117.24070002", 
"-117.24038866075", "-117.24022087", "-117.240140015", "-117.239834913333", 
"-117.240522195673", "-117.240133633077", "-117.210527201581", 
"-117.236141991053", "-117.24063566", "-117.23989078", "-117.210382870833"
), .Dim = c(15L, 6L), .Dimnames = list(NULL, c("study", "ID", 
"locDate", "locNumb", "meanLat", "meanLon"))), structure(c("Study2", 
"Study2", "Study2", "Study2", "Study2", "Study2", "Study2", "Study2", 
"Study2", "Study2", "Study2", "Study2", "Study2", "Study2", "59", 
"59", "59", "59", "59", "59", "59", "59", "59", "59", "59", "59", 
"59", "59", "2011-07-12", "2011-07-12", "2011-07-12", "2011-07-12", 
"2011-07-12", "2011-07-12", "2011-07-12", "2011-07-12", "2011-07-12", 
"2011-07-12", "2011-07-12", "2011-07-12", "2011-07-12", "2011-07-12", 
"429", "418", "422", "432", "430", "426", "420", "354", "67", 
"419", "425", "427", "421", "428", "32.86543857", "32.867004565", 
"32.8694241808955", "32.8651107616667", "32.868857725", "32.8693627126536", 
"32.8696329253571", "32.86955278", "32.869014345", "32.8692111971429", 
"32.8694814566667", "32.8696187847619", "32.8698972233333", "32.868283279", 
"-117.254194355", "-117.25283091", "-117.25050148", "-117.254406255417", 
"-117.25133879", "-117.235585179972", "-117.250467514464", "-117.25014399", 
"-117.25006813", "-117.235456126857", "-117.235959423333", "-117.250773722857", 
"-117.250450876667", "-117.2512085715"), .Dim = c(14L, 6L), .Dimnames = list(
NULL, c("study", "ID", "locDate", "locNumb", "meanLat", "meanLon"
    ))))

【问题讨论】:

  • mytest 不是数据框,而是包含两个矩阵的列表。是否要将转换应用于这两个矩阵?
  • @Sven Hohenstein。哎呀,没有意识到这一点。它解释了为什么一切都处于相同的模式。我仍然不确定如何解决这个问题。

标签: r list lapply r-factor


【解决方案1】:

您可以使用

转换两个矩阵的列表
lapply(mytest, as.data.frame)

结果是两个数据框的列表。它们的所有列都是因子。

【讨论】:

  • 它有效,但是哇,我应该能够弄清楚这一点。非常感谢@Sven!
  • ..查看数据似乎没有必要将 DF 列在列表中。我会将它们全部放在一个 DF 中……让您的生活更轻松恕我直言。
【解决方案2】:
# something  <- your data

问题在于您没有处理数据帧:

sapply(something, class)

所以你需要将你的数据转换成实际的数据框:

something2 = lapply(something, function(x) as.data.frame(x, stringsAsFactors = F))

注意,如果你不介意你的其他变量也会被转换成因子,那么 您只需省略 stringsAsFactors 部分,就完成了。但是,我假设您希望将其他变量保留为字符。然后只转换你想要的变量:

for (i in 1:length(something2)) {
  something2[[i]]$meanLat = factor(something2[[i]]$meanLat)
  something2[[i]]$meanLon = factor(something2[[i]]$meanLon)
}

所以现在这两个变量被转换为一个因子,让我们检查第一个:

str(something2[[1]])

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-03-29
    • 2018-05-17
    • 2018-07-18
    • 1970-01-01
    • 2011-02-20
    • 1970-01-01
    • 2021-09-24
    相关资源
    最近更新 更多