替换(重新编码)列表中的值

时间:2016-07-25 12:58:02

标签: r

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')

无效

4 个答案:

答案 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