R 使用不熔化的lappy将字符转换为因子

R 使用不熔化的lappy将字符转换为因子,r,list,lapply,r-factor,R,List,Lapply,R Factor,我有一个字符矩阵列表,我想把其中两列(lat,lon)转换成factor。我已经尝试过使用Lappy来实现这一点,它是有效的,但它也重塑了我的数据帧。我尝试了两种使用as.factor的方法:一种是只在两个所需的列上使用as.factor(不好,将所有其他列返回为NA),另一种是在整个数据帧上使用as.factor,但在这两种情况下都会发生重塑。然后,我试图将我的矩阵列表融化回原始的、所需的形状,但我认为最好不要创建原始问题,而不是在事后尝试修复它。关于如何在不发生重塑的情况下转换为因子,有什么

我有一个字符矩阵列表,我想把其中两列(lat,lon)转换成factor。我已经尝试过使用Lappy来实现这一点,它是有效的,但它也重塑了我的数据帧。我尝试了两种使用as.factor的方法:一种是只在两个所需的列上使用as.factor(不好,将所有其他列返回为NA),另一种是在整个数据帧上使用as.factor,但在这两种情况下都会发生重塑。然后,我试图将我的矩阵列表融化回原始的、所需的形状,但我认为最好不要创建原始问题,而不是在事后尝试修复它。关于如何在不发生重塑的情况下转换为因子,有什么想法吗

仅在cols上尝试:

ix <- 5:6
mytest[ix] <- lapply(mytest[ix], 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"
    ))))

您可以使用

lapply(mytest, as.data.frame)
结果是两个数据帧的列表。它们的所有列都是因子

# 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]])

mytest
不是数据帧,而是包含两个矩阵的列表。是否要将转换应用于两个矩阵?@Sven Hohenstein。哎呀,我没意识到。它解释了为什么一切都处于相同的模式。我仍然不确定如何解决这个问题。它是有效的,但是哇,我应该能够解决这个问题。非常感谢@Sven!。。从数据来看,似乎没有必要将DFs包含在列表中。我会把它们都放在一个DF中。。让你的生活更轻松。
str(something2[[1]])