我有四个数据框的列表。每个数据框都有相同的第一列person.id(每个数据帧的唯一键)我想填充零。
ISSUE:
代码运行但输出到控制台,不会更改列表中的实际数据帧。
示例数据:
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
如何将更改应用于列表中每个数据框中的每个列名称person.id?
我想要的是在列表中的每个数据框中填充零:
> dataList[[1]]$person.id
[1] 003200 003201 003202 003203 003204 003205 003206 003207 003208
[10] 003209 003210 003211 003212 003213 003214
答案 0 :(得分:5)
您lapply
需要返回完整数据框的功能。您使用的函数只返回赋值的结果,它只是列的值,而不是整个数据帧。您还需要保存结果。在这里,我们使用transform
作为修改数据框的函数,并使用person.id
参数修改person.id
列(请参阅?transform
):
df.pad <- lapply(dataList, transform, person.id=str_pad(person.id, 6, pad = "0"))
然后,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
您需要返回数据框,因为R
不是按引用分配的语言。您对i
中lapply
的分配只是修改了i
的本地副本,而不是全局环境中dataList
中的数据框。如果您希望修改dataList
,可以在上面的表达式中用dataList
替换df.pad
,这将导致dataList
被包含修改后的新版本覆盖数据框。
答案 1 :(得分:3)
您对列进行了分配,但a)没有return
数据帧,也没有b)您是否将结果分配给新名称。 (欢迎使用函数式编程。在对象上运行函数不会改变原始对象。)你得到的只是名字:
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)
library(stringr)
newList <- lapply(dataList, function(i){
i$person.id <- str_pad(i$person.id, 6, pad = "0"); return(i)
})
> str(newList)
List of 4
$ :'data.frame': 15 obs. of 2 variables:
..$ person.id: chr [1:15] "003200" "003201" "003202" "003203" ...
..$ letter : Factor w/ 15 levels "a","b","c","d",..: 1 2 3 4 5 6 7 8 9 10 ...
$ :'data.frame': 15 obs. of 2 variables:
..$ person.id: chr [1:15] "004100" "004101" "004102" "004103" ...
..$ letter : Factor w/ 15 levels "h","i","j","k",..: 1 2 3 4 5 6 7 8 9 10 ...
$ :'data.frame': 15 obs. of 2 variables:
..$ person.id: chr [1:15] "004300" "004301" "004302" "004303" ...
..$ letter : Factor w/ 15 levels "j","k","l","m",..: 1 2 3 4 5 6 7 8 9 10 ...
$ :'data.frame': 15 obs. of 2 variables:
..$ person.id: chr [1:15] "005500" "005501" "005502" "005503" ...
..$ letter : Factor w/ 15 levels "e","f","g","h",..: 1 2 3 4 5 6 7 8 9 10 ...
答案 2 :(得分:0)
包 qdapTools 中的pad
功能可以执行此操作:
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)
library(qdapTools)
lapply(dataList, function(x) {x[["person.id"]] <- pad(x[["person.id"]], 6);x})