You've baked everything up in a complex deserializing constructor. This makes the code hard to understand and maintain.
- You have a coordinate, so make class for that, we can call it Coord, that is capable of doing its own deserializing.
- You have a Point, which consists of an ID and a coordinate, so make a class for that, that is capable of doing its own deserializing.
- The Datasetwill then just use the deserializing functions of thePoint.
- Don't limit deserializing to ifstreams. Make it work with anyistream.
Deserializing is often done by overloading operator>> and operator<< for the types involved. Here's one way of splitting the problem up in smaller parts that are easier to understand:
struct Coord {
    std::vector<int> data;
    // read one Coord
    friend std::istream& operator>>(std::istream& is, Coord& c) {        
        if(std::string line; std::getline(is, line)) { // read until end of line
            c.data.clear();
            std::istringstream iss(line); // put it in an istringstream
            // ... and extract the values:
            for(int tmp; iss >> tmp;) c.data.push_back(tmp);
        }
        return is;
    }
    // write one Coord
    friend std::ostream& operator<<(std::ostream& os, const Coord& c) {
        if(not c.data.empty()) {
            auto it = c.data.begin();
            os << *it;
            for(++it; it != c.data.end(); ++it) os << ' ' << *it;
        }
        return os;
    }
};
struct Point {
    std::string ID;
    Coord coord;
    // read one Point
    friend std::istream& operator>>(std::istream& is, Point& p) {
        return is >> p.ID >> p.coord;
    }
    // write one Point
    friend std::ostream& operator<<(std::ostream& os, const Point& p) {
        return os << p.ID << ' ' << p.coord;
    }
};
struct Dataset {
    std::vector<Point> points;
    // read one Dataset
    friend std::istream& operator>>(std::istream& is, Dataset& ds) {
        ds.points.clear();
        for(Point tmp; is >> tmp;) ds.points.push_back(std::move(tmp));
        if(!ds.points.empty()) is.clear();
        return is;
    }
    // write one Dataset
    friend std::ostream& operator<<(std::ostream& os, const Dataset& ds) {
        for(auto& p : ds.points) os << p << '\n';
        return os;
    }
};
If you really want a deserializing constructor in Dataset you just need to add these:
    Dataset() = default;
    Dataset(std::istream& is) { 
        if(!(is >> *this))
            throw std::runtime_error("Failed reading Dataset");
    }
You can then open your file and use operator>> to fill the Dataset and operator<< to print the Dataset on screen - or to another file if you wish.
int main() {
    if(std::ifstream file("datafile.dat"); file) {
        if(Dataset ds; file >> ds) {      // populate the Dataset
            std::cout << ds;              // print the result to screen
        }
    }
}
Demo