【发布时间】:2020-03-24 20:45:01
【问题描述】:
我的数据框中有十个年龄列,名称相似(即agehhm1、agehhm2、...、agehhm10),应该以年为单位保存一个人的年龄。目前,它们都是字符串,因为一些观察包括“月”、“mos”等词,因为有些人不到 1 岁。我正在尝试使用 lapply 遍历这些列,并将包含这些字符串模式的观察结果替换为“0”值。我很接近,但在如何命名我想要分配 lapply 输出的新列时遇到了困难。我正在尝试 setNames。我没有收到错误消息,但我的数据框中没有任何变化。
我正在尝试以下方法。我将 10 个年龄列存储在一个对象“hhages_varnames”中。然后,我将 lapply 应用于此对象列表,如果我找到任何“月”文本模式,则将每个对象中的适用 obs 替换为 0。我正在尝试创建名为agehhm1_clean 等的新列作为输出。
我愿意接受您认为更适合这方面的任何其他方法。
hhages_varnames 只是一个对象,我在其中存储 10 个年龄列的名称。所以它只是一个 1:10 的向量,带有 "agehhm1" "agehhm2",..."agehhm10"。
hhages_varnames <- ls(dataframe_name, pattern = "agehhm.*")
setNames(lapply(hhages_varnames, FUN = function(x) (replace(x, grepl("month|MO|mos|days|months", dataframe_name[,x]),"0"))),
paste(names(hhages_varnames),"clean", sep="_"))
【问题讨论】:
-
您的
setNames在名称中添加了一个空格,我建议paste0或paste(..., sep='_')或类似名称。此外,setNames不会产生副作用,您需要将来自setNames的返回捕获到某个变量中。 -
如果您提供
hhages_varnames的样本会更容易提供帮助。也许使用dput函数。 -
@r2evans 和 Ian Campbell 感谢您的编辑和 cmets。 r2evans 你说得对,我是在意外情况下在粘贴中添加空格 - 很好。我看到你现在看到的关于 setNames 没有副作用的情况。虽然,我不确定如何将它们捕获到一个变量中,因为我正在尝试创建 10 个变量(即,10 个原始变量中的每一个都有一个新变量)。 Ian Campbell 我尝试在帖子中添加说明,即 hhages_varnames 只是一个包含 10 个年龄变量的 var 名称的对象。不过,我也可以尝试自己添加变量的文件/照片。
-
kayla,如果框架完全相似,强烈建议将其保留为
data.frames 中的单个list:当您对其中一个进行操作时,请执行相同的操作使用lapply轻松到所有帧。 Ref:stackoverflow.com/a/24376207 ...从长远来看,这是值得的,如果列表有 3 帧或 300 帧,你不会得到,你的努力是一样的。 -
@r2evans 我很抱歉——我想我在这里误用了变量这个词——我想我应该说我的数据框中的列。我只有一个包含 10 列的数据框。