无法更改数据框中的值

时间:2016-09-13 21:15:41

标签: r

我创建了一个数据框:

for (int i = 0; i < toss; i++) {
            numberShowing = i;
            result=i;
            toss --;
            System.out.println(result);
} if (toss == 0){
toss = 10;
}

这导致df <- mydata %>% mutate(length.class=cut(mydata$count,breaks = c(1, 10, 100, 1000, 10000),include.lowest=TRUE)) %>% group_by(length.class) %>% summarise(count = n()) 的值类似于&#34;(100,1e + 03)&#34;而我更喜欢&#34;(100,1000)&#34;。但是,手动更改它不起作用:

df$length.class

为什么更改字符串是不可能的,是什么尝试R告诉我这条消息?

奖金问题:如何获取原始值或解决已更改的行(4)?执行更改命令后,现在有一个&#34; NA&#34;而不是&#34;(100,1e + 03)&#34;。

3 个答案:

答案 0 :(得分:5)

dig.lab中的cut参数应该注意这一点。

来自文档:

  

未给出标签时使用的整数。它决定了   格式化中断号码时使用的位数。

在您的情况下,您希望显示5位数字,因此您的代码将是

mydata %>%
    mutate(length.class = cut(count, breaks = c(1, 10, 100, 1000, 10000), 
                            include.lowest = TRUE, dig.lab = 5))

结果因素的级别如下:

[1] "[1,10]"       "(10,100]"     "(100,1000]"   "(1000,10000]"

答案 1 :(得分:1)

警告(下方)告诉您所有需要知道的事项。

Warnmeldung:
In `[<-.factor`(`*tmp*`, df$length.class == "(100,1e+03]", value = c(1L,  :
  invalid factor level, NA generated

df$length.classfactor,其值存储为不同的levels。您正试图以错误的方式替换值。适当的方法是更改​​levels,而不是显示的值。因子存储为整数,内存中的整数与用于显示的levels之间存在映射。

第一个选项是紧凑的,尽管它不可​​读。或者你总是可以使用两行代码

levels(df$length.class)[ which(levels(df$length.class) == "(100,1e+03]") ] <- "(100,1000]"

lvl_idx <- which(levels(df$length.class) == "(100,1e+03]") 
levels(df$length.class)[lvl_idx] <- "(100,1000]"

答案 2 :(得分:0)

library(dplyr)
brks <- 10^(0:4)
# ensure one in each bin
mydata <- data.frame(count = brks[-1] - diff(brks)/2)

# create labels to be used in `cut`
lbls <- mapply(paste0, "(", head(brks, n = -1), ",", brks[-1], "]")
# fix the first, it's open on the left
lbls[1] <- paste0("[", brks[1], ",", brks[2], "]")

df <- mydata %>%
  mutate(length.class = cut(count, breaks = brks, labels = lbls,
         include.lowest = TRUE)) %>%
  group_by(length.class) %>% summarise(count = n())
df
# # A tibble: 4 x 2
#   length.class count
#         <fctr> <int>
# 1       [1,10]     1
# 2     (10,100]     1
# 3   (100,1000]     1
# 4 (1000,10000]     1

如果您不想重做计算,只需执行以下操作:

labels(df$length.count) <- lbls

(假设你根据等级/箱数正确定义了lbls。)

关于代码的一些注释:

  • mydata$内不需要mutate:您的代码引用了管道外mydata$count的值,该值可能与{{1}的当前值不同管道中data.frame的列;它不在这里,但它很容易,特别是前面的countmutate动词。
  • minor,但许多人认为变量名中点的使用不仅仅是一个样式问题:由于R进行类继承的方式,它可能导致一些不必要的查找(尽管我认为更多的是使用虚线函数名称而不是变量,它也与命名约定的一致性有关。)