【发布时间】:2020-02-25 03:34:14
【问题描述】:
我有一个数据,我用 10 个观察对 5 个变量进行了子集化,以解释我的问题。
originaldata <- read_table2("Desktop/originaldata.txt", col_names = FALSE)
str(originaldata)
Classes ‘spec_tbl_df’, ‘tbl_df’, ‘tbl’ and 'data.frame': 5822 obs. of 86 variables:
- attr(*, "spec")=
.. cols(
.. X1 = col_double(),
.. X2 = col_double(),
..............
.. X86 = col_double()
.. )
dt <- subset(originaldata, select = c(6:10))
dt <- dt[1:10,]
str(dt)
Classes ‘tbl_df’, ‘tbl’ and 'data.frame': 10 obs. of 5 variables:
$ X6 : num 0 1 0 2 1 0 2 0 0 3
$ X7 : num 5 4 4 3 4 5 2 7 1 5
$ X8 : num 1 1 2 2 1 0 0 0 3 0
$ X9 : num 3 4 4 4 4 5 5 2 6 2
$ X10: num 7 6 3 5 7 0 7 7 6 7
> dput(dt)
structure(list(X6 = c(0, 1, 0, 2, 1, 0, 2, 0, 0, 3), X7 = c(5,
4, 4, 3, 4, 5, 2, 7, 1, 5), X8 = c(1, 1, 2, 2, 1, 0, 0, 0, 3,
0), X9 = c(3, 4, 4, 4, 4, 5, 5, 2, 6, 2), X10 = c(7, 6, 3, 5,
7, 0, 7, 7, 6, 7)), class = c("tbl_df", "tbl", "data.frame"), row.names = c(NA,
-10L))
我想做的是重构(重新调整)数据。我使用for loop 进行但得到缺失值。
for (i in which(colnames(dt)=="X6"):which(colnames(dt)=="X10")){
dt[,i] <- factor(dt[,i],
levels=c(0:9),
labels=c("0%",
"1-10%",
"11-23%",
"24-36%",
"37-49%",
"50-62%",
"63-75%",
"76-88%",
"89-99%",
"100%"))
}
str(dt)
Classes ‘tbl_df’, ‘tbl’ and 'data.frame': 10 obs. of 5 variables:
$ X6 : Factor w/ 10 levels "0%","1-10%","11-23%",..: NA NA NA NA NA NA NA NA NA NA
$ X7 : Factor w/ 10 levels "0%","1-10%","11-23%",..: NA NA NA NA NA NA NA NA NA NA
$ X8 : Factor w/ 10 levels "0%","1-10%","11-23%",..: NA NA NA NA NA NA NA NA NA NA
$ X9 : Factor w/ 10 levels "0%","1-10%","11-23%",..: NA NA NA NA NA NA NA NA NA NA
$ X10: Factor w/ 10 levels "0%","1-10%","11-23%",..: NA NA NA NA NA NA NA NA NA NA
> dput(dt)
structure(list(X6 = structure(c(NA_integer_, NA_integer_, NA_integer_,
NA_integer_, NA_integer_, NA_integer_, NA_integer_, NA_integer_,
NA_integer_, NA_integer_), class = "factor", .Label = c("0%",
"1-10%", "11-23%", "24-36%", "37-49%", "50-62%", "63-75%", "76-88%",
"89-99%", "100%")), X7 = structure(c(NA_integer_, NA_integer_,
NA_integer_, NA_integer_, NA_integer_, NA_integer_, NA_integer_,
NA_integer_, NA_integer_, NA_integer_), class = "factor", .Label = c("0%",
"1-10%", "11-23%", "24-36%", "37-49%", "50-62%", "63-75%", "76-88%",
"89-99%", "100%")), X8 = structure(c(NA_integer_, NA_integer_,
NA_integer_, NA_integer_, NA_integer_, NA_integer_, NA_integer_,
NA_integer_, NA_integer_, NA_integer_), class = "factor", .Label = c("0%",
"1-10%", "11-23%", "24-36%", "37-49%", "50-62%", "63-75%", "76-88%",
"89-99%", "100%")), X9 = structure(c(NA_integer_, NA_integer_,
NA_integer_, NA_integer_, NA_integer_, NA_integer_, NA_integer_,
NA_integer_, NA_integer_, NA_integer_), class = "factor", .Label = c("0%",
"1-10%", "11-23%", "24-36%", "37-49%", "50-62%", "63-75%", "76-88%",
"89-99%", "100%")), X10 = structure(c(NA_integer_, NA_integer_,
NA_integer_, NA_integer_, NA_integer_, NA_integer_, NA_integer_,
NA_integer_, NA_integer_, NA_integer_), class = "factor", .Label = c("0%",
"1-10%", "11-23%", "24-36%", "37-49%", "50-62%", "63-75%", "76-88%",
"89-99%", "100%"))), row.names = c(NA, -10L), class = c("tbl_df",
"tbl", "data.frame"))
我该如何解决这个问题?我不知道是什么原因导致这些 NA.
如果我单独修改,它是正确的。见专栏X6。
dt$X6 <- factor(dt$X6,
levels=c(0:9),
labels=c("0%",
"1-10%",
"11-23%",
"24-36%",
"37-49%",
"50-62%",
"63-75%",
"76-88%",
"89-99%",
"100%"))
str(dt)
Classes ‘tbl_df’, ‘tbl’ and 'data.frame': 10 obs. of 5 variables:
$ X6 : Factor w/ 10 levels "0%","1-10%","11-23%",..: 1 2 1 3 2 1 3 1 1 4
$ X7 : num 5 4 4 3 4 5 2 7 1 5
$ X8 : num 1 1 2 2 1 0 0 0 3 0
$ X9 : num 3 4 4 4 4 5 5 2 6 2
$ X10: num 7 6 3 5 7 0 7 7 6 7
> dput(dt)
structure(list(X6 = structure(c(1L, 2L, 1L, 3L, 2L, 1L, 3L, 1L,
1L, 4L), .Label = c("0%", "1-10%", "11-23%", "24-36%", "37-49%",
"50-62%", "63-75%", "76-88%", "89-99%", "100%"), class = "factor"),
X7 = c(5, 4, 4, 3, 4, 5, 2, 7, 1, 5), X8 = c(1, 1, 2, 2,
1, 0, 0, 0, 3, 0), X9 = c(3, 4, 4, 4, 4, 5, 5, 2, 6, 2),
X10 = c(7, 6, 3, 5, 7, 0, 7, 7, 6, 7)), row.names = c(NA,
-10L), class = c("tbl_df", "tbl", "data.frame"))
我也试过这个并得到NA。
dt[,2] <- factor(dt[,2],
levels=c(0:9),
labels=c("0%",
"1-10%",
"11-23%",
"24-36%",
"37-49%",
"50-62%",
"63-75%",
"76-88%",
"89-99%",
"100%"))
str(dt)
Classes ‘tbl_df’, ‘tbl’ and 'data.frame': 10 obs. of 5 variables:
$ X6 : Factor w/ 10 levels "0%","1-10%","11-23%",..: 1 2 1 3 2 1 3 1 1 4
$ X7 : Factor w/ 10 levels "0%","1-10%","11-23%",..: NA NA NA NA NA NA NA NA NA NA
$ X8 : num 1 1 2 2 1 0 0 0 3 0
$ X9 : num 3 4 4 4 4 5 5 2 6 2
$ X10: num 7 6 3 5 7 0 7 7 6 7
【问题讨论】:
-
不要打印出您的数据。使用
dput(dt)并将输出复制到您的问题中。 -
@dcarlson 我编辑了。
标签: r for-loop data-manipulation