A有一个具有以下结构的列表。
mylist=list(y~ A,
y ~ A+B,
y ~ A+B+C)
我想用“y “
替换(重新编码)“z”
。我的目标是
mylist=list(z~ A,
z ~ A+B,
z ~ A+B+C)
问:如何替换(重新编码)列表中的值?
我试过这个:
for i in range(len(mylist)):
mylist[i] = mylist[i].replace('y','z')
无效
答案 0 :(得分:13)
update
函数对公式很有用。
只需添加.
即可指明要保留的任何公式方面。因此,对于您的问题,以下是一个快速的单行。
lapply(mylist, update, new = z~.)
答案 1 :(得分:6)
我建议使用R内置的公式操作功能。这使我们可以在不使用正则表达式的情况下分别使用fromula的不同术语进行操作
lapply(mylist, function(x) reformulate(as.character(terms(x))[3], "z"))
# [[1]]
# z ~ A
# <environment: 0x59c6040>
#
# [[2]]
# z ~ A + B
# <environment: 0x59c0308>
#
# [[3]]
# z ~ A + B + C
# <environment: 0x59bb7b8>
答案 2 :(得分:2)
由于您有一个公式列表作为开头,您可以将公式转换为字符,使用gsub
进行替换并将其转换回公式。使用env
参数指定公式的环境,以确保它们与原始列表相同:
lapply(mylist, function(f) formula(gsub("y", "z", format(f)), env = .GlobalEnv))
# [[1]]
# z ~ A
# [[2]]
# z ~ A + B
# [[3]]
# z ~ A + B + C
为了照顾@David Arenburg的关注,以便y
的替换总是发生在公式的左侧,我们可以使用更受限制的正则表达式:
lapply(mylist, function(f) formula(gsub("y(\\s)?(?=~)", "z", format(f), perl = T), env = .GlobalEnv))
# [[1]]
# z ~ A
# [[2]]
# z ~ A + B
# [[3]]
# z ~ A + B + C
答案 3 :(得分:2)
就像表达式一样,公式具有可替换的部分。因此,您可以使用[[<-
替换公式的部分内容。 y
值是表达式列表中的第二个值,因为~
是一个函数,因此是第一个。
lapply(mylist, "[[<-", 2, as.name("z"))
# [[1]]
# z ~ A
#
# [[2]]
# z ~ A + B
#
# [[3]]
# z ~ A + B + C