将零填充到列表中所有数据帧中的一列

mte*_*sha 2 r list dataframe

我有一个包含四个数据帧的列表.每个数据帧都有相同的第一列person.id(每个数据帧的唯一键)我想填充零.

问题:

代码运行但输出到控制台,不会更改列表中的实际数据帧.

示例数据:

df1 <- data.frame(person.id = 3200:3214, letter = letters[1:15])
df2 <- data.frame(person.id = 4100:4114, letter = letters[8:22])
df3 <- data.frame(person.id = 4300:4314, letter = letters[10:24])
df4 <- data.frame(person.id = 5500:5514, letter = letters[5:19])
dataList <- list(df1, df2, df3, df4)

lapply(dataList, function(i){
  i$person.id <- str_pad(i$person.id, 6, pad = "0")
})

# Console output pads the zeros (not expected): 
[[1]]
 [1] "003200" "003201" "003202" "003203" "003204" "003205" "003206" "003207" "003208"
[10] "003209" "003210" "003211" "003212" "003213" "003214"

# Data Frames in list return with no change:

> dataList[[1]]$person.id
[1] 3200 3201 3202 3203 3204 3205 3206 3207 3208 3209 3210 3211 3212 3213 3214
Run Code Online (Sandbox Code Playgroud)

如何将更改应用于列表中每个数据框中的每个列名称person.id?

我想要的是在我的列表中的每个数据框中填充零:

> dataList[[1]]$person.id
 [1] 003200 003201 003202 003203 003204 003205 003206 003207 003208
[10] 003209 003210 003211 003212 003213 003214
Run Code Online (Sandbox Code Playgroud)

Bro*_*ieG 5

lapply返回完整数据框所需的功能.您使用的函数只返回赋值的结果,它只是列的值,而不是整个数据帧.您还需要保存结果.这里我们使用transform函数修改数据框,并使用person.id参数修改person.id列(请参阅参考资料?transform):

df.pad <- lapply(dataList, transform, person.id=str_pad(person.id, 6, pad = "0"))
Run Code Online (Sandbox Code Playgroud)

然后,df.pad[[1]]:产生:

[[1]]
   person.id letter
1     003200      a
2     003201      b
3     003202      c
4     003203      d
5     003204      e
6     003205      f
7     003206      g
8     003207      h
9     003208      i
10    003209      j
11    003210      k
12    003211      l
13    003212      m
14    003213      n
15    003214      o
Run Code Online (Sandbox Code Playgroud)

您需要返回数据框,因为R它不是按引用分配的语言.你分配到ilapply刚刚修改的本地副本i,而不是数据帧中dataList的全球环境.如果想dataList要修改您也可以替换dataListdf.pad在上述表达式中,这将导致dataList与它含有改性的数据帧的新版本被覆盖.